android - Activity 恢复后对新副本的 Viewpager fragment 引用

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

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

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

现在这个方法将通过空指针异常,因为setdata(data)在内部访问fragmentarraylist字段>.

这对我来说是一个问题,因为我的 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/

相关文章:

android - 如何引用API的shell命令向API发起POST请求?

java - viewpager 中的 Android 应用程序 fragment 无缘无故分离

android - FragmentTransaction.replace() 不工作

android - 可见时刷新 fragment 中的适配器

android - 在 viewpager 和 EditText 验证中滑动

android - 如何从 Android Studio 中删除自动格式化?

java - 如何用另一个数组列表中歌曲的艺术家姓名填充数组列表

android ConstraintLayoutStates - 如何获取对 constraintLayoutStates 对象的引用?

android - fragment 中带有选项卡的抽屉导航

Android ViewPager获取 View 空指针异常