アクティビティで現在アクティブな (表示されている、現在再開状態にある) すべてのフラグメントを取得する簡単な方法が見つかりませんでした。アクティビティでカスタム ブックキーピングを行わなくても可能ですか? FragmentManager はこの機能をサポートしていないようです。
7 に答える
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 フィールドである可能性があります)。
それはすでに独自の簿記ですが、達成したい非常に具体的な目標(ステータスに依存するリスト)を考慮すると、私の意見ではまだ非常に限られています。
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;
}
私はこれで解決しました:
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;
}
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
ではなくa になりList
ます)。自己責任で使用してください:)
これを行う別の方法は、フラグメントをアクティビティに追加するときにフラグメントにタグを付けることです。
たとえば、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));
}
不規則だが合法的な方法を使用できます
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;
}