【问题标题】:Viewpager fragment reference to new copy after activity restore活动恢复后对新副本的 Viewpager 片段引用
【发布时间】:2017-11-07 13:14:03
【问题描述】:

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

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

现在此方法将通过null pointer 异常,因为setdata(data) 正在内部访问fragmentarraylist 字段。

这给我带来了一个问题,因为我的活动必须通过调用 fragment 的公共方法(如文档所建议的那样)不断地将网络数据提供给它。

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

【问题讨论】:

  • 片段由 Viewpager 管理,因此您的 Activity 应该与 ViewPager 适配器通信,而不是直接与 Fragment 通信。

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


【解决方案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();
    }

【讨论】:

  • 感谢这项工作。在我的情况下还有一个补充,您需要在 onSaveInstanceState 方法中手动保存适配器的状态,然后在 oncreate 检索状态(如果存在)设置 viewpager 时,而不是创建片段的新实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
相关资源
最近更新 更多