android – ViewPager里面的片段,怎么保留状态?

前端之家收集整理的这篇文章主要介绍了android – ViewPager里面的片段,怎么保留状态?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的应用程序中,片段活动包含片段A和片段B两个片段.片段B是包含3个片段的视图寻呼机.

在我的活动中,为了防止在配置更改中重新生成片段:

  1. if(getSupportFragmentManager().findFragmentByTag(MAIN_TAB_FRAGMENT) == null) {
  2. getSupportFragmentManager().beginTransaction().replace(R.id.container,new MainTabFragment(),MAIN_TAB_FRAGMENT).commit();
  3. }

片段代码B:

  1. public class MainTabFragment extends Fragment {
  2.  
  3. private PagerSlidingTabStrip mSlidingTabLayout;
  4. private LfPagerAdapter adapter;
  5. private ViewPager mViewPager;
  6.  
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setRetainInstance(true);
  11. }
  12.  
  13. @Nullable
  14. @Override
  15. public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
  16. return inflater.inflate(R.layout.fragment_tab,container,false);
  17. }
  18.  
  19. @Override
  20. public void onViewCreated(View view,Bundle savedInstanceState) {
  21.  
  22. this.adapter = new LfPagerAdapter(getChildFragmentManager());
  23.  
  24. this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
  25. this.mViewPager.setAdapter(adapter);
  26.  
  27. this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs);
  28. this.mSlidingTabLayout.setViewPager(this.mViewPager);
  29. }
  30. }

适配器代码

  1. public class LfPagerAdapter extends FragmentPagerAdapter {
  2.  
  3. private static final int NUM_ITEMS = 3;
  4.  
  5. private FragmentManager fragmentManager;
  6.  
  7. public LfPagerAdapter(FragmentManager fm) {
  8. super(fm);
  9. this.fragmentManager = fm;
  10. }
  11.  
  12. @Override
  13. public int getCount() {
  14. return NUM_ITEMS;
  15. }
  16.  
  17. @Override
  18. public Fragment getItem(int position) {
  19. Log.d("TEST","TEST");
  20. switch (position) {
  21. case 1:
  22. return FragmentC.newInstance();
  23. case 2:
  24. return FragmentD.newInstance();
  25. default:
  26. return FragmentE.newInstance();
  27. }
  28. }
  29. }

我的问题是,我无法保留视图寻呼机的状态,它的小孩片段的方向更改.

显然,这是每个轮回的要求:

  1. this.adapter = new LfPagerAdapter(getChildFragmentManager());

这将导致整个寻呼机被重新创建,对吧?结果是

  1. getItem(int position)

将会在每个轮播中被调用,片段将从头创建并丢失其状态:

  1. return FragmentC.newInstance();

我试着解决这个问题:

  1. if(this.adapter == null)
  2. this.adapter = new LfPagerAdapter(getChildFragmentManager());

在onViewCreated中,但是结果是旋转了被移除的寻呼机内的碎片.

任何想法如何正确保留传呼机内的状态?

解决方法

您需要做两件事来解决问题:

1)您应该使用onCreate方法代替onViewCreated来实例化LfPagerAdapter;

即:

  1. public class MainTabFragment extends Fragment {
  2.  
  3. private PagerSlidingTabStrip mSlidingTabLayout;
  4. private LfPagerAdapter adapter;
  5. private ViewPager mViewPager;
  6.  
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setRetainInstance(true);
  11. this.adapter = new LfPagerAdapter(getChildFragmentManager());
  12. }
  13.  
  14. @Nullable
  15. @Override
  16. public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) {
  17.  
  18.  
  19. this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
  20. this.mViewPager.setAdapter(adapter);
  21.  
  22. this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs);
  23. this.mSlidingTabLayout.setViewPager(this.mViewPager);
  24. }
  25. }

2)您将需要扩展FragmentStatePagerAdapter而不是FragmentPagerAdapter

猜你在找的Android相关文章