有没有办法获取活动中所有当前活动片段的引用?

Zso*_*agy 61 android android-fragments android-3.0-honeycomb

我还没有找到一种简单的方法来获取活动中所有当前活动的(可见的,当前处于恢复状态)碎片.我的活动中是否可以不使用自定义簿记?似乎FragmentManager不支持此功能.

did*_*_X8 109

看起来API目前错过了像"getFragments"这样的方法.
但是,使用Activity类的事件"onAttachFragment",应该很容易做到你想要的.我会做的事情如下:

List<WeakReference<Fragment>> fragList = new ArrayList<WeakReference<Fragment>>();
@Override
public void onAttachFragment (Fragment fragment) {
    fragList.add(new WeakReference(fragment));
}

public List<Fragment> getActiveFragments() {
    ArrayList<Fragment> ret = new ArrayList<Fragment>();
    for(WeakReference<Fragment> ref : fragList) {
        Fragment f = ref.get();
        if(f != null) {
            if(f.isVisible()) {
                ret.add(f);
            }
        }
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

如果没有就绪方法从对象中读取状态(示例中为isActive()),我将覆盖onResume和onPause来设置标志(可能只是一个bool字段).
这已经是一些自己的簿记,但考虑到你想要实现的非常具体的目标(状态依赖列表),我认为仍然非常有限.

  • 如果片段已分离,是否应更新片段引用列表?否则你可能在该列表中有片段,这些片段已经很久了(或者至少不再在屏幕上了). (4认同)
  • 实际上,支持库公开了一个`getFragments()`方法但不应该使用它.它标有`@ hide`,不应该包含在支持库jar中.它不应被视为导出API的一部分. (3认同)
  • 嗯,如果没有引用添加到onAttachFragment列表中的实际片段,那么WeakReference <Fragment> ref是否会变为null? (2认同)
  • 这对我的目的很有用.PS我有一行:if(f!= null && f.isVisible()){ret.add(f); } (2认同)

Mic*_*ael 14

如果您使用Android支持库,则可以调用隐藏FragmentManager.getFragments()方法:

public List<Fragment> getVisibleFragments() {
    List<Fragment> allFragments = getSupportFragmentManager().getFragments();
    if (allFragments == null || allFragments.isEmpty()) {
        return Collections.emptyList();
    }

    List<Fragment> visibleFragments = new ArrayList<Fragment>();
    for (Fragment fragment : allFragments) {
        if (fragment.isVisible()) {
            visibleFragments.add(fragment);
        }
    }
    return visibleFragments;
}
Run Code Online (Sandbox Code Playgroud)

  • @Michael我想为未来的观众注意这个方法的一个重要的事情(看起来你已经在这里看到了)是它返回内部片段列表,而不是它的副本.所以不要修改你得到的清单; 根据返回的响应实例化一个新的List并修改*that*one.否则,您将花一整天时间调试间歇性的IndexOutOfBoundsException.:) (9认同)