2017-02-28 7 views
8

私は、しかし、私は例外を取得しています、活動のonCreateでpopBackStack()()メソッドを呼び出します。popBackStackとcommitAllowingStateLoss

Caused by java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

android.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:1428) 
android.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1446) 
android.app.FragmentManagerImpl.popBackStack (FragmentManager.java:572) 

私はこの例外を解決する一つの方法が、提供することを理解し、あなたが上の効果を持つOKですUIとエンドユーザは、commitAllowingStateLossを呼び出すことです。

問題は、popBackStackではコミット・コールがありません。 popBackStackを呼び出してステートロスを許可する他の方法はありますか?

私はこれをonPostResumeで行い、この例外を取得しています。

+0

私は、このエラーだと思う(それだけで良く、フラグメントのようなものです)非アクティブなアクティビティでpopBackStack()を呼び出すとスローされます。さらにデバッグするコードを投稿してください – arjun

+0

@arjun onPostResume内からpopBackStackを呼び出します。これは、すべてのリファレンスによれば、アプリケーションの再開後に呼び出す安全な場所でした。アプリケーションが巨大なのでコードをもう投稿することはできませんが、onPostResume内でpopBackStackが呼び出されるようになります。確かに、アプリケーションが安全に再開した後にGUIを再初期化できる場所が必要ですか? – user3690202

+0

@arjunが提案したように、あなたは 'onResumeFragments()'でそれを実行しようとしましたか? – azizbekian

答えて

1

多くの研究の結果、私は、アクティビティが再開されたときにAndroidでフラグメントを操作することができないという結論に達しました。私は、ブログのポストonPostResume()とonResumeFragments()のバックスラックスからフラグメントをポップするように試みました。両方とも、プロダクションにリリースされると断続的なクラッシュが発生しました。

この現実の欠点は、たとえば、レベルフラグメントの終わりと、インタースティシャル広告の後に次のレベル(レベルフラグメントの終わりまでの別のフラグメント)が表示された場合フラグメントを使用することはできません。

私の個人的な状況では、アプリケーションからすべてのフラグメントを削除しました。 XMLでUIを編集するのは便利ですが、フラグメントライフサイクルは現在の状態では使用できないため、自分自身の「フラグメント」サブシステムをロールバックしましたが、アクティビティonResumeから操作できるため、レイアウトは使いやすくなっています。

Android用の開発が本当に不愉快になるため、Googleがいつでもこの問題を解決することを願っています。誰もがフラグメントを使用する必要がありますが、あなたは常に取得する典型的なonSaveInstanceState例外が気に入らない場合はとにかく、ここで私の「GameScreen」実装である

/** 
* GameScreen 
*/ 
public class GameScreen { 

    private int id; 
    private View view; 
    private ViewGroup viewGroup; 
    protected MainActivity mainActivity; 

    public GameScreen(MainActivity mainActivity, int id) { 
     this.mainActivity = mainActivity; 
     this.id = id; 
    } 

    public void create(LayoutInflater layoutInflater, ViewGroup viewGroup) { 
     this.viewGroup = viewGroup; 
     view = layoutInflater.inflate(id, viewGroup, false); 
     viewGroup.addView(view); 
    } 

    public void show() { 
     for (int i = 0; i < viewGroup.getChildCount(); i++) { 
      View v = viewGroup.getChildAt(i); 
      if (v != view) { 
       v.setVisibility(View.INVISIBLE); 
      } 
     } 

     view.setVisibility(View.VISIBLE); 
    } 
} 
0

私はcommit()が活動状態が復元される前に呼び出される可能性のあるアクティビティコールバックである場合、このエラーがスローされることがあり、このブログから以下http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

を得ました。 のでpopBackStack()を行うのに最適な場所はonResumeFragments()コールバック

popBackStack()では、どのようなそれがないことがちょうどbackstackで最後FragmentTransactionを逆であるとして内部呼ばcommit()を持っています。

+0

私はFragmentActivityを使用せず、アクティビティのみを使用しています。そして、そのブログ記事(私は前にそれを読んだことがある)は、onPostResume()内からこれを行うことがうまくいくことを既に__guarantees__ - 明らかにしていません。したがって、そのブログには基本的に間違っている情報が含まれています。 – user3690202

+0

しかし 'onResumeFragments()'コールバックを使って試すことができる 'FragamentActivity'を拡張する' AppCombatActivity'を使うことをお勧めします – arjun

+0

あなたはそれが推奨されている場所を正確に引用できますか?これは、Android Studioで新しいフラグメントアクティビティプロジェクトを作成するときに生成されるデフォルトの基本クラスではありません。 – user3690202

関連する問題