具有相同类的多个片段实例的ViewPager

我正在尝试创build一个包含5个片段的ViewPager。 5个片段“容器”,所以他们每个都包含2个片段。 4个第一个片段具有相同的布局,属于同一个类别。 第五个来自另一个class级,这个没有问题。

问题是,当活动启动时,只有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, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(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> 

所以这个代码不工作,似乎在片段容器的左边的列表被replace在每个片段中,只有位置0的片段显示它。 (当前它显示的types为“JOURNAL”的适配器的列表,但它应该显示“AGENDA”types的列表。

——————– * 但是!… * ——————–

如果我创build不同的fragment_container布局文件,并在onCreateView和onViewCreated在ContainerFragment.java编写IF条件,一切工作正常。 所以:

ContainerFragment.java

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL) return inflater.inflate(R.layout.fragment_container_journal, container, false); else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES) return inflater.inflater(R.layout.fragment_container_movies, container, false); else return super.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(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(); 

我想这是因为在每个片段中,我replace了相同ID的LinearLayout? (replaceable_list)我以为有可能共享每个片段相同的布局文件,并不想创build4个相同的布局文件。 但看起来我必须这样做? 还是我在这里错过了什么?

感谢您的时间,

  • 一次closures所有最近打开/正在运行的应用程序button-android
  • Android ImageView在GingerBread下面的FrameLayout里面不match_parent
  • 用户在MediaController上快速触摸。 错误只发生在Nexus 4上。
  • 主题相关的选定小部件的颜色
  • 错误:标记需要一个'drawable'属性或定义drawable的子标记
  • Android XML:android:海拔与应用程序:海拔
  • Android +带有自定义视图层次结构的ListFragment
  • popup软键盘时滚动页面
  • 尽pipe答复很迟,但是我面临着同样的问题,我通过使用来解决这个问题

     getChildFragmentManager().beginTransaction() 

    代替

     getActivity().getSupportFragmentManager().beginTransaction() 

    就像在这种情况下,我们试图从一个片段(连接到ViewPager的片段列表中的一个,因此持有ViewPager的Activity)中进行事务,所以我们必须在这里使用getChildFragmentManager()来获得所需的结果。

    我能够解决这个问题,通过设置在每个片段膨胀的布局的ID到它的位置。

    你需要做的只是改变你的ContainerFragment类的方法onCreateView到:

     @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_container, container, false); v.setId(CONTAINER_TYPE) return v; 

    这是因为FragmentPagerAdapter实现处理片段标签的方式。