2016-05-05 9 views
3

再開すると、私のアクティビティがDialogFragmentと表示されることがあります。このfragment transactions tutorialに示唆されているように、私はで恐怖症を避けるためにこれをやっていますIllegalStateException: Can not perform this action after onSaveInstanceState。ほとんどの場合、すべてが順調です。onSaveInstanceState()の後にonResumeFragments()が呼び出されます。

しかし、私の活動には、特定の環境設定が変更されたときにアクティビティを再開するOnSharedPreferenceChangeListenerがあります。リスナーをトリガーする設定変更は、Spinnerで選択を行うことによって発生します。アクティビティがrecreate()を呼び出して再開すると、IllegalStateExceptionが返されます。私は私が私のインスタンスの状態を保存したいのでrecreate()を使用することを好むだろう

finish(); 
final Intent intent = new Intent(StartActivity.this, StartActivity.class); 
startActivity(intent); 

:活動は、このように自分自身を再起動した場合でも、全く問題ありません。 onSaveInstanceState()の後にonResumeFragments()が呼び出されるのはなぜですか?

+0

'recreate()'で再起動したときの 'IllegalStateException'メッセージは'トップレベルのアクティビティでしか呼び出せません 'でしょうか? – sakiM

+0

@sakiM "onSaveInstanceStateの後にこのアクションを実行できません" –

+0

このメッセージは 'recreate()'からスローされないようですが、再作成の直接的な例外は ''トップレベルアクティビティ ''または '' 'メインスレッド「 '' – sakiM

答えて

0

まあ、私は親切な気分です。私はsetRetainInstance(true)と呼ばれる断片を持っていましたが、onActivityCreated(...)の代わりにonCreate(...)にその活動への参照をキャッシュしました。フラグメントは古いアクティビティを使用してダイアログを表示しようとしていました。 (具体的には、アクティビティは間接的にフラグメントのメソッドをonResumeFragments()から呼び出していました。)かなり面倒です。おそらく、断片と活動の関係全体を再考すべきです。

編集:私は以来、これが私の間違いではない別の方法を発見しました。実行中のアクティビティにロック画面が表示された場合は、が呼び出されます。しかし、ロック画面が解除されると、onRestoreInstanceState()でなく、onResume()onResumeFragments()の間にあるである。このバグは少なくとも5歳です。ありがとう、Google。

関連する問題