2012-06-20 16 views
34

savedInstanceState()を使用してフラグメントを削除するときに状態を保存してから、そのフラグメントをバックスタックからポップするときの状態を復元できますか?バックスタックからフラグメントを復元すると、savedInstanceStateバンドルは常にnullです。savedInstanceStateバックスタックからフラグメントを復元するとき

現在、アプリケーションのフローは次のようになります。フラグメントの作成 - >フラグメントの削除(バックスタックへの追加) - >フラグメントがバックスタックから復元されました(savedInstanceStateバンドルがnullです)。私は、問題が削除されると、スタックをバックアップするために追加されたときonSavedInstanceState()が呼び出されないことだと思います

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle bundle = getArguments(); 
    Long playlistId = bundle.getLong(Constants.PLAYLIST_ID); 
    int playlistItemId = bundle.getInt(Constants.PLAYLISTITEM_ID); 

    if (savedInstanceState == null) { 
     selectedVideoNumber = playlistItemId; 
    } else { 
     selectedVideoNumber = savedInstanceState.getInt("SELECTED_VIDEO"); 
    } 
} 

public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(Constants.SELECTED_VIDEO, selectedVideoNumber); 
    } 

:ここ

は、関連するコードです。 onsavedInstanceState()を使用できない場合、これを修正する別の方法がありますか?

答えて

0

FWIWに答え、私もこれを打つが、私の場合にはonSaveInstanceStateが適切と呼ばれていましたし、新しいアクティビティ断片をスマートフォンで育ったときに私は私の状態データに押し込みます。あなたと同じですが、onActivityCreatedはw/savedInstanceState常にnullと呼ばれました。 IMHO、私はバグだと思う。

私はその後、私はグローバル変数としてonCreateViewに戻るビューを保存したいと...静的MyApplicationという状態を作成し、「グローバル変数」の同等のためにそこにデータを置くことによって、その周りに

5

を働きました私が戻ったとき、私は単純にこれをチェック:

if(mBaseView != null) { 
     // Remove the view from the parent 
     ((ViewGroup)mBaseView.getParent()).removeView(mBaseView); 
     // Return it 
     return mBaseView; 
    } 
+0

多くの感謝を:) ITSは、これは良いアイデアです –

+6

わからない私の問題を解決しました。これは、参照を保存するとメモリが解放されるという見解を破壊するという目的を打破しますか? – craigrs84

+0

私は実際にはわかりませんが、私は直接テストを行っていません。しかし、私の思考はこのようになります。あなたのレイアウトのすべての要素を初期化するときは、これらの要素の大部分をグローバル変数として設定するのが標準です。上記の例では参照のためにベースビューをリサイクルできない場合、Androidはリサイクルできませんこれらのビューのいずれかを使用すると、メモリと同じ問題が発生します。 – AllDayAmazing

4

問題は、フラグメントが持っている必要があることですIdまたはそれを追跡するFragmentManagerためには、それに関連付けられたTag

これを行うには、少なくとも3つの方法があります:XMLレイアウトで

  1. があなたのフラグメントのためのIdを宣言:

    android:[email protected]+id/<Id> 
    
  2. をご断片コンテナViewIdを持っている場合は、FragmentTransactionを使用するには、 :

    FragmentTransaction add (int containerViewId, Fragment fragment) 
    
  3. あなたのフラグメントがViewに関連付けられていない場合(例:ヘッドレスフラグメント)、それにTagを与える:

    FragmentTransaction add (Fragment fragment, String tag) 
    

Also, see this SO answer.

関連する問題