【发布时间】:2015-01-15 14:44:18
【问题描述】:
在我的应用程序中,片段活动包含两个片段,片段 A 和片段 B。片段 B 是一个包含 3 个片段的视图分页器。
在我的活动中,为了防止在配置更改时重新创建片段:
if(getSupportFragmentManager().findFragmentByTag(MAIN_TAB_FRAGMENT) == null) {
getSupportFragmentManager().beginTransaction().replace(R.id.container, new MainTabFragment(), MAIN_TAB_FRAGMENT).commit();
}
片段 B 的代码:
public class MainTabFragment extends Fragment {
private PagerSlidingTabStrip mSlidingTabLayout;
private LfPagerAdapter adapter;
private ViewPager mViewPager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tab, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
this.adapter = new LfPagerAdapter(getChildFragmentManager());
this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
this.mViewPager.setAdapter(adapter);
this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs);
this.mSlidingTabLayout.setViewPager(this.mViewPager);
}
}
适配器代码:
public class LfPagerAdapter extends FragmentPagerAdapter {
private static final int NUM_ITEMS = 3;
private FragmentManager fragmentManager;
public LfPagerAdapter(FragmentManager fm) {
super(fm);
this.fragmentManager = fm;
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
Log.d("TEST","TEST");
switch (position) {
case 1:
return FragmentC.newInstance();
case 2:
return FragmentD.newInstance();
default:
return FragmentE.newInstance();
}
}
}
我的问题是我无法在方向更改时保留视图寻呼机及其子片段的状态。
显然,这在每次旋转时都会调用:
this.adapter = new LfPagerAdapter(getChildFragmentManager());
这将导致重新创建整个寻呼机,对吗?结果
getItem(int position)
将在每次旋转时调用,片段将从头开始创建并丢失其状态:
return FragmentC.newInstance();
我尝试用以下方法解决这个问题:
if(this.adapter == null)
this.adapter = new LfPagerAdapter(getChildFragmentManager());
在onViewCreated 中,但结果是在旋转时,寻呼机内的片段被移除。
任何想法如何正确保留寻呼机内的状态?
【问题讨论】:
-
我通过在 instanceState 中保存片段状态(和选定的寻呼机位置)来做到这一点(不知道确切的覆盖,因为我现在无法访问 Eclipse)。然后在 OnCreate(如果在活动中)或 OnCreateView()(如果在片段中),我检查它们是否存在,然后重新创建它们。
-
Fragments 由FragmentManager自动管理和恢复,PagerAdapter实现旨在保持对它们的持久引用。getItem()只会被调用一次来初始化每个页面。 -
@artworkad:
Fragments好像已经被保留了。你到底想做什么?你能再描述一下吗?
标签: android android-fragments fragmentpageradapter