【问题标题】:Properly Interacting with fragments in FragmentPagerAdapter与 FragmentPagerAdapter 中的片段正确交互
【发布时间】:2013-12-06 09:36:30
【问题描述】:

除了 ViewPager 之外,我还在使用 FragmentPagerAdapter 进行活动,以在 3 个片段之间进行分页。根据来自第一个片段(谷歌地图上的标记)的输入,当用户切换到片段 2 或 3 时,我会发出 API 请求,然后更新这些片段视图。

总体思路是我在FragmentPagerAdapter内部管理一个SparseArray,然后为viewPager创建一个onPageChangeListener:

pager.setAdapter(pagerAdapter);
pager.setOnPageChangeListener(new OnPageChangeListener() {

    @Override
    public void onPageSelected(int position) {
        if (position == 1) {
            SecondFragment fragment = (SecondFragment) pagerAdapter.getFragment(1);
            fragment.update(currentMarker);
        } else if (position == 2) {
            ThirdFragment fragment = (ThirdFragment) pagerAdapter.getFragment(2);
            fragment.update(currentMarker);
        }
    }
});

我还覆盖了 FragmentPagerAdapter 中的 instantiateItem 和 destroyItem,以在我的 sparseArray 中正确删除和重新添加片段引用。

这很好用,但问题是当我在第二个或第三个片段页面上旋转我的设备时。当尝试调用片段上的方法时(在活动的 onPageSelected 中),它给了我一个 NullPointerException - 我猜是因为重新创建了活动,当 onPageSelected 触发时还没有创建这些片段。

我认为更好的方法可能是想出一种方法,让片段在可见时进行 API 调用,而不是让活动触发它(这可能更简洁 - 与/from Fragments 通常更好),但任何建议都将不胜感激。

【问题讨论】:

    标签: java android


    【解决方案1】:

    OnSelect(page2) 当您执行 API 调用并获取 API 调用结果时,应该有一个回调来更新 API 引用的“OnSaveInstanceState”对象。

    如果你这样做了,那么 IMO,这就是你从框架中得到的:

    API 返回结果

    结果更新片段 该片段通过对“OnSaveInstanceState”的任何调用进行处理

    OnOrientationChange :: 条件是在 API 返回结果之后发生 片段以反映 API 结果的状态保存

    由于方向更改而重新创建活动 在 SavedInstanceState != null 上,它从状态中重新实例化片段,包括早期 api 调用的残留物......

    查看接受的answer here了解更多详情

    【讨论】:

    • 谢谢 - 我正在阅读有关 onSaveInstanceState 的内容,看起来是解决我的问题的好方法。试用后我会接受的。
    猜你喜欢
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2018-07-13
    相关资源
    最近更新 更多