我正在使用ViewPager
,FragmentStatePagerAdapter
和Fragment
。
如何使用它的功能(首次初始化,按钮处理程序)加载每个片段?
我设法让按钮工作,但我必须移动主要活动中的所有句柄。如何在片段中保留功能?
这是我的适配器:
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 :(得分:1)
您的问题似乎并不是真正的滑动,而是如何将与特定屏幕相关的代码组合在一起。
目前,您在活动布局中使用onClick
属性,在要处理点击的元素上。此属性的合约需要在您的活动中使用公共void方法,将单个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逻辑仅在该片段上。