我有一个ViewPager
,有4个标签。
我正在使用扩展FragmentPagerAdapter
的自定义适配器。
问题在于,当我更改标签时,会再次创建第一个Fragment
,尽管它不是当前可见的。
此外,这仅在第四次更改选项卡后发生。例如。 tab1 - > tab2 - > TAB3 =>来自tab1的onStop
被调用。 - > tab2 =>来自tab1的onCreateView
被调用(onAttach
未被调用)。
我想避免这种情况。我需要所有选项卡始终保持其状态,即使它们当前未显示。 我怎么能这样做?
答案 0 :(得分:22)
就像使用setOffscreenPageLimit()
中的方法ViewPager
一样简单。
答案 1 :(得分:0)
实例化片段时,请调用setRetainInstance(true)
。这将保留片段的实例状态。 onCreateView
仍然会被调用,您需要确保使用已保存的状态,然后只渲染视图而不再重新加载任何数据,例如:使用boolean
来表示您的片段是否已经初始化。
你会做这样的事情:
public static class MyAdapter extends FragmentPagerAdapter {
@Override
public Fragment getItem(int position) {
MyFragment myFragment = new MyFragment();
myFragment.setRetainInstance(true);
return myFragment;
}
}
class MyFragment extends Fragment {
.
.
.
boolean initialized = false;
ArrayList<MyData> myData = null;
void onCreate(...) {
if (initialized) {
renderViews();
} else {
initialized = true;
loadData();
renderViews();
}
}
}
您无需实施onSaveInstanceState()
。它将自动处理。
答案 2 :(得分:0)
Viewpager有一个名为 setOffScreenPageLimit 的公共方法,该方法指示在空闲状态下视图层次结构中将保留到当前页面任一侧的页面数。
活动:
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = findViewById(R.id.container);
mViewPager.setOffscreenPageLimit(3); // change your number here
mViewPager.setAdapter(mSectionsPagerAdapter);