如果有人感兴趣,我相信我已经找到了解决问题的适当方法。
我创建了我的 FragmentPagerAdapter 以便正常初始化第一页,但第二页只是稍后将初始化片段的容器。
public static class ContractDetailsPagerAdapter extends FragmentPagerAdapter {
int numFrags = 2;
public ContractDetailsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
String argObject = null;
switch (position) {
case 0:
fragment = new SectionsFragment();
argObject = SectionsFragment.ARG_OBJECT;
break;
case 1:
fragment = new DetailsFragmentContainer();
argObject = DetailsFragmentContainer.ARG_OBJECT;
break;
default:
Log.e("ContractDetailsPagerAdapter", "called getItem outofbounds");
return null;
}
Bundle bundle = new Bundle();
bundle.putInt(argObject, position+1);
fragment.setArguments(bundle);
return fragment;
}
@Override
public int getCount() {
return numFrags;
}
}
在 FragmentPagerAdapter 中,SectionsFragment 是第一个具有 3 个 ListView 的 Fragment,DetailsFragmentContainer 只是一个容器,稍后将初始化 DetailsFragment。
public class DetailsFragmentContainer extends Fragment {
public static final String ARG_OBJECT = "details_fragment_container";
Bundle ids;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ids = getArguments();
View v = inflater.inflate(R.layout.fragments_container, container, false);
return v;
}
public void createDetailsFragment(int parentItemId) {
Fragment fragment = new DetailsFragment();
ids.putInt(Columns.COLUMN_PARENTITEMID, parentItemId);
fragment.setArguments(ids);
getChildFragmentManager().beginTransaction().add(R.id.fragments_frame, fragment).commit();
}
}
以及容器的 XML 布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragments_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
parentitemid 是我稍后从 SectionsFragment 中单击第三列中的项目时需要得到的。
然后,使用如何通过在 ViewPager 中用手指滑动来禁用分页但仍然能够以编程方式滑动的接受的答案?,我稍微调整了一下,以便可以设置被刷卡的能力。
public class SetSwipeableViewPager extends ViewPager {
boolean canSwipe = false;
public SetSwipeableViewPager(Context context) {
super(context);
}
public SetSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (!canSwipe) {
return false;
}
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!canSwipe) {
return false;
}
return super.onTouchEvent(event);
}
public void canSwipe(boolean swipeable) {
canSwipe = swipeable;
}
}
有了这个,我们可以简单地将当我们在第一页时滑动的能力设置为 false,并在我们离开时启用它。
首先,我们设置一个监听器来检查我们何时选择第一页并禁用滑动。
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
if (position == 0)
mViewPager.canSwipe(false);
}
});
当我们在第 3 个列表中选择一个项目时,我们创建 DetailsFragment 并将其放入 DetailsFragmentContainer 中,将当前项目设置为 1,以便 viewpager 显示第 2 页,然后重新启用滑动。
public void OnSection3Selected(long id) {
int parentItemId = ContractDetailsActivity.getItemId(id, getActivity());
...
((DetailsFragmentContainer) fragment).createDetailsFragment(parentItemId);
mViewPager.setCurrentItem(1);
mViewPager.canSwipe(true);
}
我希望这对某人有帮助!