36

私はアクティビティからフラグメントに自分のアプリケーションの一部を切り替えて、きれいなActionBarタブを使用できるようにしました。OnCreateViewが複数回呼び出されました/ ActionBarとフラグメントで作業する

しかし、移行を完了した後、私は問題に遭遇しました。別のタブに切り替えるたびに、そのフラグメントが再び作成されます。 onCreateとonCreateViewの両方が、タブを表示するたびに呼び出されます。

私はこれらのフラグメントの1を開くために意図され、それぞれが4つのタブ、持っている:ここで

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) {   

     } 

    } 

誰かが右に私をポイントしてくださいでしたが方向?

+0

どうすればいいですか? –

答えて

43

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

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

また、フラグメントを破棄できるようにすることもできますが、独立して保存された状態を維持することができます。これは、より少ないメモリを使用し、より遅いスイッチング時間を犠牲にする。注意の方法は、追加/削除と併せてFragmentManager.saveFragmentInstanceState(Fragment)FragmentManager.setInitialSavedState(Fragment.SavedState)となります。これはFragmentStatePagerAdapterが取るアプローチです。

実装のヒントについては、source for FragmentPagerAdaptersource for FragmentStatePagerAdapterをご覧ください。

+0

これは回避策です。 onCreateとonCreateViewはまだ呼び出されており、状態を保存するには多くの作業が必要です。すでに描かれているwachフラグメントのビューをそのまま維持して置き換える方法はありませんか?なぜそれらをもう一度塗り替えるのですか? –

+1

非表示オプションがあります。 –

+0

こんにちは、私は、ActionBarのタブを使用していて、アタッチとデタッチを使用しています!いくつかのサンプルコードを説明して、他のタブに切り替えたときにインスタンスの状態を保存し、タブに戻るときの状態を維持する方法を教えてください。ありがとうございます –

7

show/hideオプションがあるので、フラグメントを再描画/再作成する必要はなく、onCreate()onCreateView()は再呼び出しされません。

+2

ここに解決策が見つかりました:http://stackoverflow.com/a/11003859/435605 –

関連する問題