1

FragmentTabsPager.java我有一个 FragmentActivity,它使用(在 Android Support v4 示例中找到)中提出的示例适配器具有选项卡式片段

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

我的 FragmentActivity 中有一个菜单项,可以让我随意重新加载片段中的数据。在我实现选项卡界面之前,我可以保证所需的片段将被加载到内存中。我会通过 获取 Fragment getSupportFragmentManager().findFragmentById(),将其转换,然后调用它的 reload 函数。很简单。

有没有办法可以与FragmentPagerAdapter从 FragmentActivity 加载的特定 Fragment 实例进行通信?使用示例中提供的TabAdapter' getItem(),我可以检索我的 Fragment 的一个实例(通过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
}
4

1 回答 1

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;
    }

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

之后很简单的创建一个方法来获取当前的 Fragment,使用 的getCurrentItem()方法ViewPager来获取当前位置。

    private MyFragment getCurrentFragment(){
      int position = viewPager.getCurrentItem(); //get current position

      List<MyFragment> fragments = getActiveFragments();
      for(MyFragment one: fragments){
         if (one.getPosition() == position)
           return one;
      }
      return null;
    }

让我知道结果如何。

于 2013-06-23T22:26:11.710 回答