Androidフラグメント:非表示/表示または追加/削除/置換を使用する場合


117

あるコンテナビューの現在のフラグメントを別のビューに置き換えたいとしましょう。置換を使用する方が良いですか...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

...または次のように、表示と非表示を切り替えますか?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

これを行う1つの方法はより効率的ですか?これらのメソッドをいつ使用するか、またはそれらが関連するフラグメントのライフサイクルにどのように影響するかについての多くの情報を見つけることができません。ありがとう!


フラグメントAからフラグメントBに移動してからフラグメントAに戻る場合、onCreateViewなどのライフサイクルイベントがフラグメントAで呼び出されないことを確認するにはどうすればよいですか?タグによるフラグメント検索は機能しますか?
blackHawk

回答:


135

フラグメントの処理方法を検討して、どのパスをたどるかを決定する必要があります。FragmentTransactionを使用してフラグメントを非表示にすると、フラグメントはまだライフサイクルの実行状態にある可能性がありますが、そのUIはウィンドウから切り離されているため、表示されません。そのため、技術的にはフラグメントと対話し、後で必要に応じてそのUIを再アタッチすることができます。フラグメントを置き換える場合、実際にはそれをコンテナから引き出しており、ライフサイクルのすべての破棄イベント(onPause、onStopなど)を通過し、何らかの理由でそのフラグメントが再度必要な場合は、それをコンテナーに戻し、すべての初期化を再度実行します。

そのフラグメントが再び必要になる可能性が高い場合は、完全に再初期化するよりもレイアウトを再描画する方がコストが低いため、フラグメントを非表示にします。


5
私たちのニーズでは、フラグメントの初期化にはかなりのコストがかかるため、おそらくそれを使用hide()show()て節約します。これをありがとう!
Robert Karl、

2
こんにちは、ウィンドウから切り離すと言うとき、onDetach()コールバックが呼び出されることを意味しますか?私はそれを実験しました、そうではないようです。
GingerJim

おそらく彼は「切り離す」を意味した。フラグメントをデタッチ/再アタッチすることもできます(追加/削除、表示/非表示に追加)
comeGetSome

1
@Zainodis、私も同じ問題を抱えています。私の解決策は、フラグメントの非表示状態をonSaveInstanceState()に保存することです-savedInstanceState.putBoolean(STATE_HIDDEN、isHidden()); 次にonCreate()で、(savedInstanceState!= null)非表示の状態を取得し、フラグメントが非表示の場合はトランザクションで非表示にします。
worawee.s 2015年

1
@ worawee.sこんにちは、更新に感謝します:)!私は私の側で少し前に問題を解決しました-非表示/表示などは本当に必要なかったので、完全に削除しました。次に、単一ペインでの追加/置換または単一フラグメントアクティビティなどの標準を使用します(基本的にマスター詳細フロー) 。それでも非表示を使用している人にとっては、ソリューションは非常に役立ちます。savedInstance!= nullをチェックしないことは、以前に犯した間違いの1つでした。
AgentKnopf 2015年

5

あなたは基本的にあなた自身に答えました。置き換えたい場合は(古いフラグメントは不要になりました)replace()一時的に非表示にする場合は、を使用しますhide()


基本的にreplaceはremoveAllを実行します。一致するhideAll :(が見つかりませんでした。–
AlikElzin-kilaka 2013

@ AlikElzin-kilaka私のアクティビティでは、3つのフラグメントすべてで3つのフラグメントを使用して、ネットワークからデータをフェッチします。この方法に従う必要があります
Mansukh Ahir

0

私はアクティビティで非表示/表示メソッドを使用して、4つのフラグメントで解決策を解決しましたが、ダイアログを表示するとランダムにウィンドウが表示され、追加および置換メソッドを使用するとウィンドウに不正なトークン例外が発生し、不正なトークン例外が発生しないため、表示/非表示メソッドは完璧ではありません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.