web-dev-qa-db-ja.com

フラグメントマネージャから古いフラグメントを削除する

AndroidでFragmentsを使用する方法を学習しようとしています。新しいfragmentがAndroidで呼び出しているときに、古いfragmentを削除しようとしています。

56

既存のフラグメントの参照を見つけ、以下のコードを使用してそのフラグメントを削除する必要があります。 exタグを使用してフラグメントを追加/コミットする必要があります。 「TAG_FRAGMENT」。

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
    getSupportFragmentManager().beginTransaction().remove(fragment).commit();

それだ。

140
Yashdeep Patel

フラグメントを別のフラグメントに置き換える場合は、最初にフラグメントを動的に追加する必要があります。 XMLでハードコーディングされたフラグメントは、置換できません。

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

この投稿を参照してください: アクティビティグループ内のフラグメントを別のフラグメントに置き換える

Refer1: プログラムでフラグメントを置き換える

17
Lokesh

古いフラグメントを削除するのと同じ問題がありました。最終的に、フラグメントを含むレイアウトをクリアしました。

LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...

これによりリークが発生するかどうかはわかりませんが、私には役立ちます。

9
Alexander

同じ問題がありました。簡単な解決策を思いつきました。フラグメント.replaceの代わりにフラグメント.addを使用します。フラグメントを置き換え、フラグメントを追加してから手動で削除するのと同じことを行います。

getFragmentManager().beginTransaction().replace(fragment).commit();

の代わりに

getFragmentManager().beginTransaction().add(fragment).commit();
1
Avinash Mali

おそらく、参照を保持している古いフラグメントをインスタンス化します。この興味深い記事を参照してください Androidでのメモリリーク-特定、治療、回避

AddToBackStackを使用する場合、ガーベッジコレクターがインスタンスを消去しないように、インスタンスフラグメントへの参照を保持します。インスタンスは、フラグメントマネージャのフラグメントリストに残ります。リストを見るには

ArrayList<Fragment> fragmentList = fragmentManager.getFragments();

次のコードは最適なソリューションではありません(メモリリークを避けるために古いフラグメントインスタンスを削除しないでください)が、fragmentMangerフラグメントリストから古いフラグメントを削除します

int index = fragmentManager.getFragments().indexOf(oldFragment);
fragmentManager.getFragments().set(index, null);

FragmentManagerはインデックスArrayListと連携してフラグメントを取得するため、arrayListのエントリを削除することはできません。

私は通常、fragmentManagerを操作するためにこのコードを使用します

public void replaceFragment(Fragment fragment, Bundle bundle) {

    if (bundle != null)
        fragment.setArguments(bundle);

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Fragment oldFragment = fragmentManager.findFragmentByTag(fragment.getClass().getName());

    //if oldFragment already exits in fragmentManager use it
    if (oldFragment != null) {
        fragment = oldFragment;
    }

    fragmentTransaction.replace(R.id.frame_content_main, fragment, fragment.getClass().getName());

    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

    fragmentTransaction.commit();
}
1
Argonga