AndroidでFragment
sを使用する方法を学習しようとしています。新しいfragment
がAndroidで呼び出しているときに、古いfragment
を削除しようとしています。
既存のフラグメントの参照を見つけ、以下のコードを使用してそのフラグメントを削除する必要があります。 exタグを使用してフラグメントを追加/コミットする必要があります。 「TAG_FRAGMENT」。
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
それだ。
フラグメントを別のフラグメントに置き換える場合は、最初にフラグメントを動的に追加する必要があります。 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: プログラムでフラグメントを置き換える
古いフラグメントを削除するのと同じ問題がありました。最終的に、フラグメントを含むレイアウトをクリアしました。
LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...
これによりリークが発生するかどうかはわかりませんが、私には役立ちます。
同じ問題がありました。簡単な解決策を思いつきました。フラグメント.replace
の代わりにフラグメント.add
を使用します。フラグメントを置き換え、フラグメントを追加してから手動で削除するのと同じことを行います。
getFragmentManager().beginTransaction().replace(fragment).commit();
の代わりに
getFragmentManager().beginTransaction().add(fragment).commit();
おそらく、参照を保持している古いフラグメントをインスタンス化します。この興味深い記事を参照してください 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();
}