47

アプリの一部をアクティビティからフラグメントに切り替えて、きちんとしたActionBarタブを使用できるようにしました。

ただし、移行を完了した後、問題が発生しました。別のタブに切り替えるたびに、そのフラグメントが最初から作成されます。タブにアクセスするたびに、onCreateとonCreateViewの両方が呼び出されます。

私には4つのタブがあり、それぞれがこれらのフラグメントの1つを開くことを目的としています。

Fragment ShopFragment = new WebActivity();
Fragment SearchFragment = new SearchActivity(context);
Fragment StoreFragment = new StoreLocatorActivity(context, this);
Fragment BlogsFragment = new BlogsActivity(context, this);

リスナーのコードは次のとおりです。

    class MyTabsListener implements ActionBar.TabListener {
        public Fragment fragment;

        public MyTabsListener(Fragment fragment) {
            this.fragment = fragment;
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            ft.hide(fragment);
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            ft.replace(R.id.fragment_container, fragment);
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {          

        }

    }

誰かが私を正しい方向に向けてくれませんか?

4

2 に答える 2

51

FragmentTransaction.replace(...)を呼び出すと、Android は FragmentTransaction.remove(...) (そのコンテナに現在追加されているすべての Fragment に対して) と FragmentTransaction.add(...) (指定されたものに対して) のシーケンスを効果的に実行ます。断片)。からフラグメントを削除するFragmentManagerと、フラグメントが破棄され、その状態が管理されなくなります。最も顕著なのは、フラグメントを再度追加すると、すべてのビューがリセットされることです。注: 同じ Fragment インスタンスを再利用しているため、Fragment はインスタンス変数の値を引き続き保持します。

この問題の 1 つの解決策は、切り替え時にFragmentTransaction.detach( Fragment)FragmentTransaction.attach(Fragment ) を使用することです。これにより Fragment ビューが再作成されます ( onDestroyView()&onCreateView()が呼び出されます) が、インスタンスの状態のバンドルが保存され、呼び出しの間に返されるため、ビューの状態を維持できます。これは、FragmentPagerAdapter がFragmentを切り替えようとするときに採用するアプローチです。

または、フラグメントの破棄を許可することもできますが、フラグメントの保存状態は個別に維持できます。これにより、切り替え時間が遅くなりますが、使用するメモリが少なくなります。注目すべきメソッドはFragmentManager.saveFragmentInstanceState(Fragment)FragmentManager.setInitialSavedState(Fragment.SavedState)で、追加/削除と関連しています。これはFragmentStatePagerAdapterが採用したアプローチです。

実装のヒントについては、FragmentPagerAdapter のソースとFragmentStatePagerAdapterのソースを参照してください。

于 2012-09-01T14:08:43.243 に答える
11

フラグメントを再描画/再作成する必要がなく、andが再度呼び出されないように、表示/非表示オプションがあります。onCreate()onCreateView()

于 2012-12-25T19:00:26.857 に答える