在ViewPager中调用Fragment的方法

4

我想做的只是调用我的Fragment类中的一个函数。但是我似乎找不到一种方法来访问我的ViewPager中的片段实例。

我的活动xml:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />

没有 id,所以我无法调用 findFragmentById() (可以吗?) 另外,我不知道要给 findFragmentByTag() 什么参数,它总是返回 null :/

3个回答

14

pagerAdapter.getItem(int) 方法通常会创建新的 Fragment 实例,因此,您可以使用 HashMap 来存储对已存在的 Fragment 的引用。

// ViewPagerAdapter
private HashMap<Integer, Fragment> fragmentHashMap = new HashMap<>();

@Override
public Fragment getItem(int position) {
    if (fragmentHashMap.get(position) != null) {
        return fragmentHashMap.get(position);
    }
    TabFragment tabFragment = new TabFragment();
    fragmentHashMap.put(position, tabFragment);
    return tabFragment;
}

然后你可以找到你的片段并调用它的方法:

FragmentAdapter fa = (FragmentAdapter)viewPager.getAdapter();
TabFragment theFragment = (TabFragment)fa.getItem(index);
theFragment.customMethod(Object obj);
你需要追踪每个片段所对应的索引,因为你将它们转换为其特定的类以便访问它们的方法。

1
ViewPager应该与FragmentAdapter相关联。因此,您可以这样做:
FragmentAdapter fa = (FragmentAdapter)viewPager.getAdapter();
Fragment f = fa.getItem(index);

3
是的,但getItem会创建一个新实例,这不是我想要的。除非我应该负责创建它一次,然后在后续调用中返回同一个实例?但我不确定那是否正确。 - foke
viewPagers不会自己进行垃圾回收,因此您应该回收您的fragments。如果您想要一个自我垃圾回收的pager,请参阅fragment pager adapter(http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html)。 - chris-tulip
1
不要使用getItem(),因为它会创建一个新的片段实例。请参见下面的答案。 - Michael Fulton

0

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