如何为FragmentPagerAdapter中的Fragment调用某个方法?

4

我有一个问题。我有一个ViewPager和一个用于它的FragmentPagerAdapter

我需要做的就是从我的ViewPager中调用一些方法,当此页面被选中时,该方法需要在我的Fragment中执行。

我试图将所有的Fragment都放在适配器里的List中,但问题是,当我旋转设备时,适配器会使用之前的片段。新的片段在旋转后被创建了,我拥有它们的列表,但不知道如何访问之前的片段。我只有对新片段的引用。

这是我的适配器:

public class MainPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragmentList;

    public MainPagerAdapter(FragmentManager fm) {
        super(fm);
        fragmentList = new ArrayList<Fragment>();
        fragmentList.add(new TaskPageFragment());
        fragmentList.add(new HistoryFragment());
        fragmentList.add(new TestFragment());
    }

    @Override
    public Fragment getItem(int i) {
        return fragmentList.get(i);
    }

    @Override
    public int getCount() {
        return 3;
    }
}

当我试图访问仅作为对象创建的片段时,无法访问Activity上下文。
Fragment fragment = pagerAdapter.getItem(i);
if (fragment instanceof SelectionListener) {
     ((SelectionListener)fragment).onTabSelected();
}

这里展示了onTabSelected()方法的调用。它是我在ViewPager中实现到每个片段的接口,当屏幕旋转后调用该方法时,我会得到一个空的Context

1个回答

0

设备配置可能会在运行时更改(例如屏幕方向)。当发生这种情况时,Activity 将被重新启动。这样做是为了使您的活动能够调整以匹配新的设备配置,并且由于片段位于活动中,它们也会被“销毁”。

但是,您的问题可能可以通过一些简单的方法解决,因为从您的问题中我理解到您不是在寻找 UI 配置更改,并且假设您正在使用 API 11+。

public void setRetainInstance (boolean retain)

自:API 级别 11

控制是否在 Activity 重新创建(例如来自配置更改)时保留片段实例。这仅适用于不在后退堆栈中的片段。如果设置,则在重新创建活动时,片段生命周期将略有不同:

  • onDestroy() 不会被调用(但 onDetach() 仍然会被调用,因为片段正在从其当前活动中分离)。
  • onCreate(Bundle) 不会被调用,因为未重新创建片段。
  • onAttach(Activity) 和 onActivityCreated(Bundle) 仍将被调用。
public MainPagerAdapter(FragmentManager fm) {
    Fragment frag = null;
    super(fm);
    fragmentList = new ArrayList<Fragment>();
    frag = new TaskPageFragment();
    frag.setRetainInstance(true);
    fragmentList.add(frag);

    frag = new HistoryFragment();
    frag.setRetainInstance(true);
    fragmentList.add(frag);

    frag = new TestFragment();
    frag.setRetainInstance(true);
    fragmentList.add(frag);
}

无济于事。问题在于FragmentPagerAdapter在创建每个片段时都会设置ID。旋转后,适配器将检查是否有任何具有相同ID的片段。如果是这样,它将返回对旧片段的引用。因此,setRetainInstance对我没有帮助。 - Dmitriy
我的错误,我以为你的问题是在屏幕方向改变时,会创建新的片段并且缺少活动上下文,并且你想保留旧实例。不幸的是,现在我重新阅读你的问题,我完全不确定你的问题是什么...抱歉:( - docslax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接