1

我正在使用ViewPagerFragmentStatePagerAdapterFragment。 如何加载每个片段的功能(第一次初始化,按钮处理程序)?处理片段内部的查看点击而非活动

我设法使按钮工作,但我不得不移动主要活动中的所有句柄。我如何保持片段中的功能?

这里是我的适配器:

public class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter { 
    public DemoCollectionPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int i) { 
     Fragment fragment = new DemoObjectFragment(); 
     Bundle args = new Bundle(); 
     // Our object is just an integer :-P 
     args.putInt(DemoObjectFragment.ARG_OBJECT, i + 1); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 

     switch (position) { 
      case 0: return "A"; 
      case 1: return "B"; 
      case 2: return "C"; 
     } 

     return "Tab " + (position + 1); 
    } 
} 

这是该片段:

public class DemoObjectFragment extends Fragment { 
    public static final String ARG_OBJECT = "object"; 
    int mNum; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // The last two arguments ensure LayoutParams are inflated 
     // properly. 
     View rootView = inflater.inflate(R.layout.activity_page, container, false); 

     //((TextView) rootView.findViewById(android.R.id.text1)).setText(
     //  Integer.toString(args.getInt(ARG_OBJECT))); 
     return rootView; 
    } 

    /** 
    * When creating, retrieve this instance's number from its arguments. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mNum = getArguments() != null ? getArguments().getInt("num") : 1; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 
} 

更新: 这里是activity_page.xml

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 

    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 


    <LinearLayout 
     android:id="@+id/panel_content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:background="#fffaffff" 
     xmlns:tools="http://schemas.android.com/tools" 
     tools:context=".GuessActivity"> 


     <TextView 
      android:id="@+id/text1" 
      android:text="@string/lorem_ipsum" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 

     <Button 
      android:id="@+id/button_validate" 
      android:layout_width="wrap_content" 
      android:layout_height="@dimen/guess_height" 
      android:layout_alignParentRight="true" 
      android:onClick="validateGuess" 
      android:text="@string/button_validate" /> 

     <TextView 
      android:id="@+id/text2" 
      android:text="@string/guess_success" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textColor="#008000" 
      android:visibility="gone"/> 


    </LinearLayout> 
</FrameLayout> 
+0

您的代码中没有任何对按钮的引用,也没有任何活动中的按钮处理程序。 – ataulm 2014-10-04 11:44:49

+0

按钮和处理程序位于activity_page.xaml中。我也会补充一点。 1秒 – alexm92 2014-10-04 11:46:30

+0

如果您的处理程序使用'onClick'属性进行链接,则您无法在片段中使用相应的方法。您需要从片段中获取对按钮的引用,并使用类似'myButton.setOnClickListener(new View.OnClickListener(){...})的方式为它分配一个onClickListener' – ataulm 2014-10-04 11:51:40

回答

1

你的问题似乎并不是关于真正的滑动,而是如何将与特定屏幕相关的代码分组在一起。

当前,您在活动布局中使用onClick属性,在要处理单击的元素上使用。此属性的合约需要在您的活动中使用公共无效的方法,以单个View对象作为参数,其名称与该属性的值相同。例如。如果你有:

<View ... 
    android:onClick="onButtonPress" /> 

你需要相应的方法在你的活动:

public void onButtonPress(View view) { 
    ... 
} 

假设每个片段都有不同的UI(不同的XML布局),你想保留片段中每个片段的逻辑,我会从更严格的命名约定开始。

目前您的DemoObjectFragment的布局被称为activity_page.xml。考虑为您在活动中使用的布局预留activity_前缀。相反,尝试fragment_demo_object.xml这个特定的片段。

您在onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)中实例化了这个片段的布局,这是正确的。在你返回根视图之前,你可以像你一样找到你的视图,虽然它们被注释掉了。

private Button validateButton; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.activity_page, container, false); 
    validateButton = (Button) rootView.findById(R.id.button_validate); 
    return rootView; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    validateButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      validateInput(); 
     } 
    }); 
} 

private void validateInput() { 
    // validate whatever you want to validate 
} 

在这种情况下,特定片段上UI的逻辑仅在该片段上。

+0

谢谢!这是我正在寻找的解决方案。 – alexm92 2014-10-04 12:37:57