activity 恢复后对新副本的 Viewpager 片段引用
Viewpager fragment reference to new copy after activity restore
当我的包含viewpager
的activity在后台被系统杀死然后恢复状态时,fragments
被正确创建并且viewpager
adapter
可以也正确指向它们。
但是当我得到一个 fragment
引用并尝试访问它的字段时,它们都是 null
(使用断点检查)。
我通过在片段 onCreateView()
和我的 activity 按钮的 clickListener
.
中放置断点来检查这一点
((WelcomeFragment)homeActivityFragmentPageAdapter.getItem(POSITION_HOME)).setdata(myData);
现在此方法将通过 null pointer
异常,因为 setdata(data)
正在内部访问 fragment
的 arraylist
字段。
这给我带来了一个问题,因为我的 activity 必须通过调用其 public 方法(如文档所建议的那样)不断地将网络数据提供给 fragment
。
状态恢复后如何保证;我的 activity.
中指出了正确的实例
尝试使用 instantiateItem
适配器方法 getItem
。
((WelcomeFragment)homeActivityFragmentPageAdapter.instantiateItem(mViewPager, POSITION_HOME)).setdata(myData);
方法getItem
是重写的方法,通常用于创建子片段。
编辑:
如果是问题场景,还需要手动存储FragmentStatePagerAdapter
的状态:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState
.putParcelable("pages",homeActivityFragmentPageAdapter.saveState());
super.onSaveInstanceState(savedInstanceState);
}
然后你可以在oncreate中获取状态:
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
homeActivityFragmentPageAdapter.restoreState(savedInstanceState.getParcelable("pages"),this.getClassLoader());
welcomeFragment = (WelcomeFragment) homeActivityFragmentPageAdapter.instantiateItem(mViewPager, POSITION_HOME);
}
else { //simply create a new instance here}
homeActivityFragmentPageAdapter.addFragmentToAdapter(welcomeFragment);
homeActivityFragmentPageAdapter.notifyDataSetChanged();
}
当我的包含viewpager
的activity在后台被系统杀死然后恢复状态时,fragments
被正确创建并且viewpager
adapter
可以也正确指向它们。
但是当我得到一个 fragment
引用并尝试访问它的字段时,它们都是 null
(使用断点检查)。
我通过在片段 onCreateView()
和我的 activity 按钮的 clickListener
.
((WelcomeFragment)homeActivityFragmentPageAdapter.getItem(POSITION_HOME)).setdata(myData);
现在此方法将通过 null pointer
异常,因为 setdata(data)
正在内部访问 fragment
的 arraylist
字段。
这给我带来了一个问题,因为我的 activity 必须通过调用其 public 方法(如文档所建议的那样)不断地将网络数据提供给 fragment
。
状态恢复后如何保证;我的 activity.
中指出了正确的实例尝试使用 instantiateItem
适配器方法 getItem
。
((WelcomeFragment)homeActivityFragmentPageAdapter.instantiateItem(mViewPager, POSITION_HOME)).setdata(myData);
方法getItem
是重写的方法,通常用于创建子片段。
编辑:
如果是问题场景,还需要手动存储FragmentStatePagerAdapter
的状态:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState
.putParcelable("pages",homeActivityFragmentPageAdapter.saveState());
super.onSaveInstanceState(savedInstanceState);
}
然后你可以在oncreate中获取状态:
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
homeActivityFragmentPageAdapter.restoreState(savedInstanceState.getParcelable("pages"),this.getClassLoader());
welcomeFragment = (WelcomeFragment) homeActivityFragmentPageAdapter.instantiateItem(mViewPager, POSITION_HOME);
}
else { //simply create a new instance here}
homeActivityFragmentPageAdapter.addFragmentToAdapter(welcomeFragment);
homeActivityFragmentPageAdapter.notifyDataSetChanged();
}