2017-06-08 10 views
2

"シングルアクティビティー - マルチフラグメント"アーキテクチャーの実装方法を学習しています。私が理解しているように、これは広く普及しており、このトピックに関する多くの記事を見つけることができます。例えば、これはhttp://vinsol.com/blog/2014/09/15/advocating-fragment-oriented-applications-in-android/です。フラグメント指向アーキテクチャーとバックスタック

このようなアーキテクチャには、私の視点から見ると、親と子の2種類があります。

親フラグメントは、例えば、引き出しからトップレベルから開始されます。私は、次のようにそれを行うことを好む:

public void startParent(Fragment fragment) { 
    manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    transaction.replace(R.id.fragment_container, fragment); 
    transaction.addToBackStack(fragment.getClass().getCanonicalName()); 
    transaction.commit();  
} 

はまた、次のように開始された子の断片がある。いずれの場合も

public void startChild(Fragment fragment) { 
    FragmentTransaction transaction = manager.beginTransaction(); 
    transaction.replace(R.id.fragment_container, fragment); 
    transaction.addToBackStack(fragment.getClass().getCanonicalName()); 
    transaction.commit(); 
} 

managerは、活動によって提供される標準的なフラグメントマネージャです。 提供されるメソッドには1つの違いがあります。最初のケースでは、バックスタックがクリアされ、新しいフラグメントを最初から開始します。秒に1回、それはバックスタックにプッシュしました。

結果としてバックスタックは次のようになります。 親 - > CHILD1 - > CHILD2

ユーザがフラグメント間を移動または単にトップレベル(引き出し)から新しいシーケンスを始めます。

ユーザが戻るボタンを押すと、最後のフラグメントがスタックからポップバックされます。私が理解するように、あなたはonBackPressed()の活動の方法を無効にする必要はありません。

画面構成が変更されるまでうまく動作します。画面構成が変更された場合onBackPressed()は、よく知られているエラーにjava.lang.IllegalStateExceptionをリード:多くの質問がStackOverflowの上でこの問題について、既に求められているが、私は」didnのありonSaveInstanceState

後にこのアクションを実行することはできません私の場合には正しい答えを見つけることができません。人々はcommitAllowingStateLoss()などに電話することを提案しますが、私の場合とは無関係です。私は新しい断片を始めたいとは思わない。ちょうど前の断片に戻したい。

私の質問は次のとおりです。画面構成の変更後にバックスタックを逆戻りしてナビゲートする方法がないと正しく理解していますか?あなたがしなければならないのは、それを無効にして最初から始めることだけです。

答えて

0

フラグメントアクティビティのonSaveInstanceState()が呼び出された後で、フラグメントトランジションを実行しようとすると、このような例外が発生します。構成が変更された後

は、システムは、そのフラグメントが作成されることはありません、なぜだとjava.lang.IllegalStateException例外が示され、リソースのための活動を回収し、後でそれを再作成します。

参考: - getting exception "IllegalStateException: Can not perform this action after onSaveInstanceState"

+0

ありがとうございますが、すでに読んでいます。それは私の質問に答えるものではありません。私は 'Activity'ライフサイクルメソッドの中でトランザクションをコミットしません。また、私は空の 'onSaveInstanceState'メソッドを私のアクティビティに入れるつもりはありません。問題は 'popBackStackAllowingStateLoss'メソッドがないことです。 –

関連する問題