web-dev-qa-db-ja.com

アクティビティで現在アクティブなすべてのフラグメントの参照を取得する方法はありますか?

アクティビティ内のすべての現在アクティブな(表示され、現在再開された状態にある)フラグメントを取得する簡単な方法は見つかりませんでした。私のアクティビティでカスタム簿記なしで可能ですか? FragmentManagerはこの機能をサポートしていないようです。

60

現在、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をオーバーライドしてフラグを設定します(単なるブールフィールドにすることができます)。

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

これを行うもう1つの方法は、フラグメントをアクティビティに追加するときにフラグメントにタグを付けることです。

たとえば、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

私はこれで解決しました:

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;

}

不規則だが法的な方法を使用できます

    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