【问题标题】:Communicating with a Fragment in a FragmentPageAdapter在 FragmentPagerAdapter 中与 Fragment 通信
【发布时间】:2013-06-24 10:18:29
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案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() 方法

    之后就很简单了,通过ViewPagergetCurrentItem()方法来获取当前Fragment的方法来获取当前位置。

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

    让我知道结果如何。

    【讨论】:

    • 完美运行,谢谢!将它加载到我的设备上,我看到它与齐柏林飞艇的天堂阶梯(1973 年现场直播)的最后一行同步运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多