活动恢复后Viewpager片段对新副本的引用

时间:2017-11-07 13:14:04

标签: android android-fragments android-viewpager activity-lifecycle

当包含viewpager的活动在后台被系统杀死然后恢复其状态时,fragments已正确创建,viewpager adapter也可以正确指向它们。 但是当我得到fragment引用并尝试访问其字段时,它们都是null(使用断点检查)。 我通过在片段onCreateView()和我的活动按钮的clickListener中放置断点来检查这一点。

((WelcomeFragment)homeActivityFragmentPageAdapter.getItem(POSITION_HOME)).setdata(myData);

现在,此方法将通过null pointer例外,因为setdata(data)正在内部访问arraylist的{​​{1}}字段。

这给我带来了问题,因为我的活动必须通过调用公共方法(如文档所示)不断向fragment提供网络数据。

如何保证国家恢复后;我的活动中指出了正确的实例。

1 个答案:

答案 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();
    }