it-swarm.com.ru

Есть ли способ получить ссылки на все активные в данный момент фрагменты в Activity?

Я не нашел простой способ получить все активные в данный момент (видимые, в настоящее время в состоянии возобновления) фрагменты в деятельности. Возможно ли это в моей деятельности? Похоже, FragmentManager не поддерживает эту функцию.

60
Zsombor Erdődy-Nagy

Похоже, API в настоящее время пропускает такой метод, как "getFragments".
Однако, используя событие "onAttachFragment" класса Activity, должно быть довольно легко делать то, что вы хотите. Я хотел бы сделать что-то вроде:

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).
Это уже какая-то собственная бухгалтерия, но, на мой взгляд, все еще очень ограниченная, учитывая вполне конкретную цель, которую вы хотите достичь (список, зависящий от статуса).

109
didi_X8

Если вы используете Android Support Library, вы можете вызвать скрытый метод 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;
}
14
Michael

Еще один способ сделать это - поместить теги в свои фрагменты, когда вы добавите их в упражнение.

Например, если вы динамически добавляете 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));
}
2
theelfismike

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, его тип - SparseArray вместо List). Используйте на свой страх и риск :)

1
0101100101

Я решил с этим:

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;

}
1
Matheus Henrique da Silva

мы можем использовать нерегулярный, но законный метод

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