正确地与FragmentPagerAdapter中的片段进行交互

时间:2013-12-06 00:44:13

标签: java android

除了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,而不是让活动触发它(这可能更干净 - 更少的沟通到/来自片段通常更好),但任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

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

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

API返回结果

结果更新片段    任何对'OnSaveInstanceState'

的调用都会处理该片段

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

由于Orientation更改,将重新创建活动    在SavedInstanceState!= null它从状态重新释放片段,包括早期api调用的残留....

有关其他详细信息,请参阅已接受answer here