31

ユーザーがドロワーからナビゲートできる約10個のフラグメントを使用して、Android用の標準のナビゲーションドロワーパターンを実装しています。現在、別のナビゲーション ドロワー アイテムが次のようにクリックされるたびに、新しいフラグメントを作成しています。

// When a new navigation item at index is clicked 
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
Fragment newFragment = null;
if (index == 0)
    fragment = new Fragment0();
...
ft.replace(R.id.container, newFragment);
ft.commit();

次のようなことを行う方が効率的かどうか疑問に思っていました。

// Somewhere in onCreate
Fragment[] fragments = new Fragment[n];
fragments[0] = new Fragment0();
fragments[1] = new Fragment1();
...

// When a new navigation item (at index) is clicked 
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.replace(R.id.container, fragments[index]);
ft.commit();

私の主な懸念は、一部のフラグメントが大量のデータ (かなり大きなリストと多数のビュー) を保持していることです。これらすべてのフラグメントをメモリに保持する問題はありますか? また、新しいフラグメントを毎回インスタンス化するよりも利点がありますか (フラグメント間のより高速な切り替えは別として)? 一般的に受け入れられている「より良い」解決策はありますか?

4

1 に答える 1

6

同様の問題がありました。私はあなたと同様のアプローチを取り、プロセッサの負荷を節約するために、フラグメントオブジェクトのインスタンスを作成するためのすべての呼び出しに次の調整を行いました: (selectItem メソッドでの使用に関連して)

switch (position) {
    case 0:
        if (fragmentOne == null)
            fragmentOne = new FragmentOne();
        getSupportFragmentManager().beginTransaction().......
        break;
    case 1:
        if (fragmentTwo == null)
            fragmentTwo = new FragmentTwo();
        getSupportFragmentManager()......

FragmentOne と FragmentTwo は 2 つの異なる Fragment クラスであり、fragmentOne と fragmentTwo は MainActivity のフィールドとして宣言されたそれらのオブジェクトです。

編集

フラグメントを保持する配列で同様のアプローチに従う方法を追加したいと思います。onCreate で新しいフラグメントを作成する代わりに、アイテムがクリックされたときにそれを行います。onCreate で、ドロワーに呼び出しを送信して、起動時にデフォルトで選択するフラグメントを選択します。

//somewhere in onCreate
if (savedInstanceState == null) {
    selectItem(defaultFragment);
}
else
    selectItem(selectedFragment);
//selectItem is method called by DrawerItemClickListener as well


//in selectItem: when navigation item at index is clicked, the listener calls this
switch (index) {
    case 0:
        if (fragments == null) {
            fragments = new Fragment[n];
            fragment[0] = new Fragment0();
        }
        else if (fragments[0] == null) {
            fragments[0] = new Fragment0();
        }
        break;
    ....
}
FragmentTransaction ft = fragmentManager.beginTransaction();
...
ft.replace(R.id.container, fragments[index]);
ft.commit();

起動が遅くなるため、onCreate でフラグメントをインスタンス化する必要はありません。必要に応じてそれらを作成し、存在する場合は後で同じものを使用します。新しいフラグメントは、初めてロードされる場合にのみ作成されます。

于 2013-10-17T20:25:48.360 に答える