我做了这个类:的Android - 保存/恢复状态FragmentStatePageAdapter
public class My_ViewPagerAdapter extends FragmentStatePagerAdapter {
private ArrayList<My_Fragment> fragments=new ArrayList<>();
private ArrayList<String> tabTitles=new ArrayList<>();
public My_ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getItemPosition(Object object) {
for (int i=0;i<fragments.size();i++){
Class<? extends My_Fragment> clazz= fragments.get(i).getClass();
if (clazz.isInstance(object)){
return i;
}
}
return POSITION_NONE;
}
@Override
public int getCount() {
return fragments.size();
}
public void addFragment(My_Fragment fragment, String tabTitle){
fragments.add(fragment);
tabTitles.add(tabTitle);
notifyDataSetChanged();
}
public void removeFragment(int position){
fragments.remove(position);
tabTitles.remove(position);
notifyDataSetChanged();
}
public My_Fragment getFragmentAtTab(int position){
return fragments.get(position);
}
@Override
public CharSequence getPageTitle(int position) {
return tabTitles.get(position);
}
}
我添加/删除动态片段/标签,我想通过配置的变化,以挽救他们的状态。
我的onSaveInstanceState实现():
int tabs=tabLayout.getTabCount();
for (int i=0;i<tabs;i++){
outState.putInt("TabsCount",tabs);
outState.putString("Tab_"+i,getTabTitle(i));
outState.putString("FragmentClassAtTab_"+i,my_viewPagerAdapter.getFragmentAtTab(i).getClass().getName());
}
和我实现onRestoreInstanceState():
for (int i=0;i<tabs;i++){
try {
My_Fragment fragment= (My_Fragment) Class.forName(savedInstanceState.getString("FragmentClassAtTab_"+i)).newInstance();
addTab(fragment ,savedInstanceState.getString("Tab_"+i));
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
catch (InstantiationException e) {
e.printStackTrace();
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
}
addTab方法是:
public void addTab(My_Fragment fragment, String title){
if (fragment!=null) my_viewPagerAdapter.addFragment(fragment,title);
tabLayout.addTab(tabLayout.newTab().setText(title));
}
该问题:
发生配置更改时,我添加的每个片段都会“自动”重新创建,因此每次都会调用其构造函数。 onCreateView在这些实例上被调用,而不是由我的代码重新创建的那些。
我需要onCreateView才能在我的选项卡中实例化的片段上调用以设置其列表视图。创建
碎片“自动”得到通过我的onRestoreInstanceState方法换成新的片断实例,但没有onCreateView方法被调用这些新的实例。
我认为我做错了,也许有更好的方式来保存标签和片段通过配置更改...任何帮助表示赞赏。
只是为了充分了解,是由一个活动或片段举行的FragmentStatePagerAdapter?配置更改后分片的数量是否正确?他们是否有预期的内容? – cYrixmorten
是的,适配器在我的活动的onCreate()方法中被占用并重新创建。如果说“片段数量”是指fragments.size(),那么是的,我用来通过调用适配器上的“removeFragment”来移除片段,但是因为它在配置更改后重新创建(总是在onCreate方法中)不需要手动删除它们。 – Lazarus
认为我的进一步输入是有限的(离开Android一段时间)。然而,你看了这个SO帖子:http://stackoverflow.com/questions/15313598/once-for-all-how-to-correctly-save-instance-state-of-fragments-in-back-stack?只是认为它看起来相关 – cYrixmorten