与FragmentPagerAdapter中的片段进行通信

时间:2013-06-23 21:35:17

标签: android android-fragments android-viewpager

我有一个FragmentActivity,它使用FragmentTabsPager.java中提供的示例适配器(在Android支持v4示例中找到)标记了片段

private static class TabsAdapter extends FragmentPagerAdapter
        implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {

我的FragmentActivity中有一个菜单项,可以让我随意重新加载片段中的数据。在我实现tab接口之前,我可以保证所需的片段将被加载到内存中。我通过getSupportFragmentManager().findFragmentById()获取片段,投射它,然后调用它的重载函数。很简单。

我是否可以通过FragmentActivity中的FragmentPagerAdapter与特定的Fragment实例进行通信?使用示例中提供的TabAdapter getItem() ,我可以检索片段的 new 实例(通过Fragment.instantiate()),但不能查找当前显示的实例。那是重要的。

编辑:除了柏拉图的回答......
由于我的所有选项卡都是不同的类(例如.FooFragment,BarFragment等),因此识别和检索特定类型的活动片段非常有用。

Object getActiveFragmentOfType(Class<?> cls) {
    List<Fragment> frags = getActiveFragments();
    for(Fragment one : frags) {
        if(cls.isInstance(one)) {
            return one;
        }
    }
    return null;
}

然后,当我想处理特定的选项卡/片段/类时,我就是这样做的

Object fooFragmentObject = getActiveFragmentOfType(FooFragment.class);
if(fooFragmentObject != null) {
    // Do something with an active reference to fooFragmentObject that's
    // guaranteed to be castable to FooFragment
}

1 个答案:

答案 0 :(得分:1)

为片段使用基类,以便添加保存方法并获取片段所用的位置。 (你可以使用一个接口,如果你不希望它们都扩展到同一个类,所有这些都会实现)

所以你的片段类就是这样的。

    class MyFragment extends SomeFragment{
       public void setPosition(int position){...}
       public int getPosition(){...}
       ......
    }

FragmentPagerAdapter编辑getItem()方法,以便在创建每个片段时保存位置。

    @Override
    public Fragment getItem(int position) {
        MyFragment fragment = new MyFragment();
        //save the position when you create the Fragment
        fragment.setPosition(position);
        return fragment;
    }

然后按照here所述实现 getActiveFragments()方法

之后,通过使用getCurrentItem()的{​​{1}}方法获取当前位置,创建一个获取当前片段的方法很简单。

ViewPager

让我知道这是如何产生的。