当包含viewpager
的活动在后台被系统杀死然后恢复其状态时,fragments
已正确创建,viewpager
adapter
也可以正确指向它们。
但是当我得到fragment
引用并尝试访问其字段时,它们都是null
(使用断点检查)。
我通过在片段onCreateView()
和我的活动按钮的clickListener
中放置断点来检查这一点。
((WelcomeFragment)homeActivityFragmentPageAdapter.getItem(POSITION_HOME)).setdata(myData);
现在,此方法将通过null pointer
例外,因为setdata(data)
正在内部访问arraylist
的{{1}}字段。
这给我带来了问题,因为我的活动必须通过调用公共方法(如文档所示)不断向fragment
提供网络数据。
如何保证国家恢复后;我的活动中指出了正确的实例。
答案 0 :(得分:1)
尝试使用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();
}