2013-07-22 7 views
12

私は実際にフラグメントの内部状態と混同しています。 私は、一度に1つのフラグメントしか保持していないアクティビティを持っていて、別のフラグメントが表示されるはずです。アクティビティonSaveInstanceStateが呼び出されている場合(私の場合は呼び出されていない)、onSaveInstanceStateからのみがと呼ばれます。Fragmentsの `onViewStateRestored`はどのように機能しますか?

私は自分の断片を止めれば、自分自身の状態をシングルトンの中に保存します(私はシングルトンも嫌いですが、私の考えはそうではありませんでした)。 ViewHirarchy全体を再作成し、キーワードnewを使用して新しいビューを作成し、状態を復元してonCreateViewに戻す必要があります。 私は明示的に行うこのビュー内のチェックボックスを持っていますNOTその状態を保存します。

しかしFragmentManagerは「知的」になりたいと、私は自分自身を作成し​​たことがないバンドルでonViewStateRestoredを呼び出し、古いCheckBoxの状態を「復元」し、私の新しいチェックボックスに適用します。これは多くの質問を投げます:

onViewStateRestoredからバンドルを制御できますか?

FragmentManagerは、おそらくガベージコレクションされたCheckBoxの状態を新しいものに適用しますか?

なぜそれだけだから、それを合計する

(未TextViews ??の)チェックボックスの状態を保存しない方法:onViewStateRestored動作しますか?私は時々断片は少し混乱得ることができますが、しばらくした後、あなたがそれらに慣れるだろう、と彼らはあなたであることを学び、Fragmentv4、> 17はまあonViewStateRestored

答えて

17

ために必要ありませんので、APIを使用してい

注意結局のところ友人。

フラグメントのonCreate()メソッドの場合は、次の操作を行います。setRetainInstance(true);あなたのビューの可視状態は保持され、そうでない場合は保持されません。

クラスFの「F」と呼ばれるフラグメントを仮定し、そのライフサイクルは次のように行くだろう: - それを示す/取り付け/インスタンス化する場合、それらが呼び出され、Fのメソッドは、この順序で、以下のとおりです。

F.newInstance(); 
F(); 
F.onCreate(); 
F.onCreateView(); 
F.onViewStateRestored; 
F.onResume(); 

この時点で、フラグメントが画面に表示されます。 デバイスが回転していると仮定すると、フラグメント情報を保持する必要があります。これは、回転によってトリガーされたイベントのフローです。

F.onSaveInstanceState(); //save your info, before the fragment is destroyed, HERE YOU CAN CONTROL THE SAVED BUNDLE, CHECK EXAMPLE BELLOW. 
F.onDestroyView(); //destroy any extra allocations your have made 
//here starts f's restore process 
F.onCreateView(); //f's view will be recreated 
F.onViewStateRestored(); //load your info and restore the state of f's view 
F.onResume(); //this method is called when your fragment is restoring its focus, sometimes you will need to insert some code here. 


//store the information using the correct types, according to your variables. 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("foo", this.foo); 
    outState.putBoolean("bar", true); 
} 

@Override 
public void onViewStateRestored(Bundle inState) { 
    super.onViewStateRestored(inState); 
    if(inState!=null) { 
     if (inState.getBoolean("bar", false)) { 
      this.foo = (ArrayList<HashMap<String, Double>>) inState.getSerializable("foo"); 
     } 
    } 

} 
関連する問題