当我包含 viewpager
的 Activity 在后台被系统杀死然后恢复其状态时,fragments
被正确创建并且 viewpager
adapter
也可以正确指向它们。
但是当我得到一个 fragment
引用并尝试访问它的字段时,它们都是 null
(使用断点检查)。
我通过在 fragment onCreateView()
和 Activity 按钮的 clickListener
中放置断点来检查这一点。
((WelcomeFragment)homeActivityFragmentPageAdapter.getItem(POSITION_HOME)).setdata(myData);
现在这个方法将通过空指针
异常,因为setdata(data)
在内部访问fragment
的arraylist
字段>.
这对我来说是一个问题,因为我的 Activity 必须通过调用其公共(public)方法(如文档所建议的那样)不断地将网络数据提供给 fragment
。
如何确保状态恢复后;我的 Activity 中指出了正确的实例。
最佳答案
尝试使用instantiateItem
适配器方法代替getItem
。
((WelcomeFragment)homeActivityFragmentPageAdapter.instantiateItem(mViewPager, POSITION_HOME)).setdata(myData);
方法 getItem
是重写方法,通常用于创建子 fragment 。
编辑:
对于问题的场景,您还需要手动存储 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();
}
关于android - Activity 恢复后对新副本的 Viewpager fragment 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47158917/