我正在尝试创建一个包含5个片段的ViewPager.
5个片段“容器”,因此每个片段包含2个片段.
4个第一个片段具有相同的布局并属于同一个类.第五个是来自另一个班级,那个没有问题.
5个片段“容器”,因此每个片段包含2个片段.
4个第一个片段具有相同的布局并属于同一个类.第五个是来自另一个班级,那个没有问题.
问题是,当活动启动时,只有1个片段似乎正在工作(viewPager中位置0的片段).我试图在我的PagerAdapter中的第0位返回新的Fragment(),但是当我这样做时,它是第二个正在工作的片段. (通过工作我的意思是在左边显示列表,我仍然没有处理右边的细节片段)
这是一些代码
CustomPagerAdapter.java
public class CustomPagerAdapter extends FragmentPagerAdapter{ public CustomPagerAdapter(FragmentManager fm) { super(fm); } public CustomPagerAdapter(FragmentManager fm,Context context) { super(fm); } @Override public Fragment getItem(int pos) { if(pos == 4) return new OtherContainerFragment(); else return new ContainerFragment(pos); } @Override public int getCount() { return 5; }
ContainerFragment.java
public class ContainerFragment extends Fragment { private int CONTAINER_TYPE; public ContainerFragment(){ } public ContainerFragment(int type){ CONTAINER_TYPE = type; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_container,container,false); } @Override public void onViewCreated(View view,Bundle savedInstanceState) { super.onViewCreated(view,savedInstanceState); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); CustomListFragment frag = new CustomListFragment(CONTAINER_TYPE); ft.replace(R.id.replaceable_list,frag); ft.commit();
CustomListFragment.java
public class CustomListFragment extends SuperCustomListFragment{ private ArrayList<Model> mModels; private int TYPE; public CustomListFragment(){ } public CustomListFragment(int type){ TYPE = type; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { return super.onCreateView(inflater,savedInstanceState); } @Override public void onViewCreated(View view,savedInstanceState); mModels = new ArrayList<Model>(); if(TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL){ mAdapter = AppUtils.getJournalListAdapter(getActivity(),mModels); new syncPapers().execute(); }else if(TYPE == AppConstants.FRAGMENT_TYPE_MOVIES){ mAdapter = AppUtils.getMoviesListAdapter(getActivity(),mModels); new syncMovies().execute(); } if(mAdapter != null) mListView.setAdapter(mAdapter); //mListView is defined in the superClass
以下是我使用的常量:
public class AppConstants { public static final int FRAGMENT_TYPE_AGENDA = 0; //so Fragment at position 0 should be of type agenda public static final int FRAGMENT_TYPE_NEWS = 1; // position 1 should be of type news public static final int FRAGMENT_TYPE_MOVIES = 2; // ... public static final int FRAGMENT_TYPE_JOURNAL = 3; // ... }
和容器的xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <LinearLayout android:id="@+id/replaceable_list" android:layout_width="match_parent" android:layout_height="match_parent" > </LinearLayout> <LinearLayout android:id="@+id/replaceable_details" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/background" > </LinearLayout> </LinearLayout>
因此,这段代码不起作用,似乎片段容器左侧的列表在每个片段中被替换,只有位置0的片段显示它. (目前它显示带有“JOURNAL”类型的适配器的列表,但它应显示“AGENDA”类型的列表.
——————–
*但是…… *
——————–
如果我创建不同的fragment_container布局文件,并在ContainerFragment.java中的onCreateView和onViewCreated中编写IF条件,一切正常.
所以:
ContainerFragment.java
@Override public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL) return inflater.inflate(R.layout.fragment_container_journal,false); else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES) return inflater.inflater(R.layout.fragment_container_movies,false); else return super.onCreateView(LayoutInflater inflater,Bundle savedInstanceState); } @Override public void onViewCreated(View view,savedInstanceState); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); CustomListFragment frag = new CustomListFragment(CONTAINER_TYPE); if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL) ft.replace(R.id.replaceable_journal_list,frag); else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES) ft.replace(R.id.replaceable_movies_list,frag); else return; ft.commit();
我想这是因为在每个片段中,我替换了相同ID的LinearLayout? (replaceable_list)
我认为可以为每个片段共享相同的布局文件,并且不想创建4个相同的布局文件.但看起来我必须这样做?
或者我在这里遗漏了什么?
感谢您的时间,
解决方法
虽然响应非常晚,但我遇到了同样的问题,我通过使用来解决问题
getChildFragmentManager().beginTransaction()
代替
getActivity().getSupportFragmentManager().beginTransaction()
在这种情况下,我们试图从一个片段(连接到ViewPager的片段列表中的一个,因此持有ViewPager的Activity)中进行事务处理,因此我们必须在此处使用getChildFragmentManager()来获得所需的结果.