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

android android-fragments android-3.0-honeycomb

32169 观看

6回复

12278 作者的声誉

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

作者: Zsombor Erdődy-Nagy 的来源 发布者: 2011 年 5 月 23 日

回应 6


108

3038 作者的声誉

决定

看起来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;
}

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

作者: didi_X8 发布者: 2011 年 8 月 11 日

2

1566 作者的声誉

另一种方法是在将片段添加到活动时将标记放在片段上。

例如,如果您动态添加4个片段,则可以添加它们,如:

for (int i = 0; i < NUM_FRAGMENTS; i++){
    MyFragment fragment = new Fragment(i);
    fragmentTransaction.add(R.id.containerId, fragment, SOME_CUSTOM_PREFIX + i).commit()
}

然后,如果您需要稍后返回所有片段,您可以执行以下操作:

for (int i = 0; i < NUM_FRAGMENTS; i++) {
     String tag = SOME_CUSTOM_PREFIX + i;
     fragmentList.add((MyFragment) fragmentManager.findFragmentByTag(tag));
}
作者: theelfismike 发布者: 2013 年 2 月 4 日

13

41270 作者的声誉

如果您使用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;
}
作者: Michael 发布者: 2013 年 12 月 4 日

1

467 作者的声誉

我解决了这个问题:

public ArrayList<Fragment> getAllFragments() {
    ArrayList<Fragment> lista = new ArrayList<Fragment>();

    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        try {
            fragment.getTag();
            lista.add(fragment);
        } catch (NullPointerException e) {

        }
    }

    return lista;

}
作者: Matheus Henrique da Silva 发布者: 2014 年 7 月 20 日

1

3246 作者的声誉

android.support.v4.app.FragmentManager有一个方法被称为getFragments()完全符合您的需要,但它永远无法访问。然而,突然间,它是,但我不确定这是否有意,因为它仍然标记为隐藏。

/**
 * Get a list of all fragments that have been added to the fragment manager.
 *
 * @return The list of all fragments or null if none.
 * @hide
 */
public abstract List<Fragment> getFragments();

常规android.app.FragmentManager根本没有这个方法,但是如果确实需要,你可以mActive通过反射获取字段来访问同一个对象(小心那里:从API 26开始,它的类型是a SparseArray而不是List)。使用风险自负:)

作者: 0101100101 发布者: 2016 年 8 月 30 日

0

369 作者的声誉

我们可以使用一些不规则但合法的方法

    ArrayList<Fragment> getActiveFragments() {
        Fragment f;
        final ArrayList<Fragment> fragments = new ArrayList<>();
        int i = 0;
        try {
            while ((f = getFragmentManager().getFragment(new Intent().putExtra("anyvalue", i++).getExtras(), "anyvalue")) != null) {
                fragments.add(f);
            }
        } catch (IllegalStateException ex) {

        }
        return fragments;
    }
作者: Yessy 发布者: 2019 年 3 月 21 日
32x32