我有三个片段:A,B和C.
在B片段中,我有一个包含3个片段的viewpager。 我用片段替换我的内容框架:
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager.beginTransaction()
.replace(R.id.content_frame, A).commit();
然后我用B片段替换内容帧并设置第二个viewpager片段。 所以我用C片段替换了内容框架。
最后,我用B片段替换内容框架,并且viewpager出现在第一个片段上。
如何序列化并保存B片段实例状态和相对内部viewpager状态?
编辑:
这是我的FragmentViewPager
公共类FragmentViewPager扩展了Fragment {
PagerAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true); //Will ignore onDestroy Method (Nested Fragments no need this if parent have it)
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_view_pager, container, false);
adapter = new PagerAdapter(getChildFragmentManager());
final PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) rootView.findViewById(R.id.tabs);
final ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
pager.post(new Runnable() {
public void run() {
pager.setAdapter(adapter);
tabs.setViewPager(pager);
}
});
return rootView;
}
@Override
public void onResume() {
super.onResume();
adapter.notifyDataSetChanged();
}
public class PagerAdapter extends FragmentPagerAdapter {
private final String[] TITLES = { "TAB1", "TAB2", "TAB3"};
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public CharSequence getPageTitle(int position) {
return TITLES[position];
}
@Override
public int getCount() {
return TITLES.length;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0: return Frag1.newInstance(position);
case 1: return Frag2.newInstance(position);
case 2: return Frag3.newInstance(position);
}
return Frag1.newInstance(position);
}
}
答案 0 :(得分:0)
解决方案比您预期的要简单得多:
我认为你Adapter
的{{1}}看起来像这样:
ViewPager
在这种情况下问题是public class ViewPagerAdapter extends FragmentStatePagerAdapter {
...
}
。通常需要的行为 - FragmentStatePagerAdapter
在Fragment
之外被回收以节省内存 - 在您的情况下是不好的。要解决这个问题并让View
不被回收,只需从Fragments
延伸:
FragmentPagerAdapter
但要小心!现在,public class ViewPagerAdapter extends FragmentPagerAdapter {
...
}
中的所有Fragments
将始终保存在内存中,无论它们是否可见!如果您的Adapter
中有多个Fragments
我强烈反对您使用ViewPager
!
我希望我能帮到你,如果你有任何其他问题,请随时提出来!