1

アプリにはフラグメントの特別なフローがあるため、可能な限りフラグメントをメモリに保持しながら、任意のフラグメントに切り替えることができる必要があります (したがって、メモリが不足している場合は、フラグメントが解放されても問題ありません)。

これまでのところ、現在のフラグメントの置換には成功していますが、前のフラグメントは常に破棄されているため、(たとえばアクション バーを使用して) 元のフラグメントに戻ると、再作成され、それには時間がかかります。

アクティビティの代わりにフラグメントを使用する理由は、アクション バーの優れた使用法、複数のフラグメントを同じコンテナー内に配置する機能、柔軟性のないアクティビティ インテントの使用法などです。

「戻る」スタックを使用しない理由は、フローが変わる可能性があるため、任意のフラグメントから任意のフラグメントに移動したいからです。

これが私のコードのスニペットです:

Fragment fragment=... ; //get the fragment from cache or create if not available yet...
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.mainActivity_fragmentContainer, fragment).commit();

ViewPager も使用しようとしましたが、スライド効果 (他のフラグメントにスライドできるようにする) を使用したくないため、フラグメントの 1 つに既に viewPager が含まれているため、障害になります。メインのviewPagerでスライド効果を無効にすると、他のビューページで無効になります。

ところで、ネイティブ API ではなく、フラグメントに Android サポート ライブラリを使用しています。

私の質問は、速度を最大化し、フラグメントに使用されるメモリが多すぎるのを回避しながら、どのフラグメントに移動するかを完全に制御するにはどうすればよいですか?


編集: 今のところ、次の回避策を使用します: onDestroyView の場合、作成されたビューの親を取得し、そこから作成されたビューを削除します。

onCreateView の場合、以前に作成したビューが既にある場合は、それを返します。

ただし、フラグメント管理がどのように機能するかがわからないため、奇妙な問題が発生する可能性があるため、これは非常に危険なことだと思います。さらに、アンドロイドがメモリが少ないと判断した場合に何が起こるかわかりません-未使用のフラグメントを破棄するか(これは良いことです)、メモリ不足の例外を引き起こしますか(これは悪いことです).

4

2 に答える 2

0

目標を達成する 1 つの方法は、FragmentTransaction.show と FragmentTransaction.hide を使用することです。Fragment.isAdded を使用して、初めて FragmentTranscation.add を表示するか呼び出すかを決定できます。欠点は、フラグメントが表示および非表示になっているときに一時停止/再開イベントを取得できないことです。onHiddenChanged をオーバーライドする必要があります。戻るナビゲーションをサポートする場合は、独自のスタックも管理する必要があります。

于 2013-11-15T15:55:37.043 に答える
0

「非常にリスクが高い」というあなたのコメントに同意します。あなたのアプローチの結果はあまり明確ではないので、これを使用することはお勧めしません.

問題をよりよく理解し、いくつかの兆候を示すには:

  1. 何が遅いと思いますか?私も「狂ったように」フラグメントを切り替え続けており、タブレットでは問題なく動作しますが、一部のローエンドの電話でははるかに時間がかかりますが、それでも許容範囲

  2. フラグメントを作成するにはどのくらいの作業が必要ですか? つまり、毎回どのような基礎となるデータを準備する必要があるのでしょうか? (ここでも、1,000 を超えるエントリを持ついくつかのリスト フラグメントがあり、それらは毎回準備され、非常に高速です)

  3. どのように正確にフラグメントを置き換えますか? 特に電話しますかgetFragmentManager().executePendingTransactions();

于 2012-04-22T15:51:19.043 に答える