2017-11-12 9 views
1

私のプロジェクトでは1つのアクティビティしか使用せず、すべての画面はフラグメントによって実装されています。私のActivityはちょうどfragmentのナビゲーション、権限の処理、警告ダイアログなどの表示を制御します。 私はよくこのような状況に遭遇します。問題は、上記のすべてのケースで、許可を要求したり、アラートを表示したりするように、ActivityFragmentはになります。この操作の直後に私が別の画面に行くと、つまりFragment Transactionを実行すると、 Activityはまだの状態になり、クラッシュする可能性があります。私はActivityresumeの状態になるまで待たなければなりません。 1つの使用例は、スプラッシュ画面で許可を求めています。権限を要求した後、許可されている場合、私は別の断片であるホーム画面を起動する必要があります。したがって、許可コールバックの後に実行される次のコードは、フラグメントトランザクションです。dialogActivityの上に来たというアクセス許可のために、アクティビティによってresumeに戻る時間がかかるため、私は待つ必要がありますいつかfragment transactionを実行します。onResumeの前にフラグメントトランザクション中にIllegalStateExceptionを防ぐ最良の方法は

onActivityResultと同じです。 現在、私はそれを迅速に修正しています。私は、フラグメントトランザクションが実行可能であるアクティビティのメンバーとして実行可能ファイルを保持しています。そして私はIllegalStateExceptionをキャッチし、catchでは、私はフラグメントトランザクションをRunnableに割り当てています。アクティビティのたびにonResume Runnableがnullでない場合は実行しています。 onActivityResultの同じ修正もあります。私はメンバーにとどまって、アクティビティのonResumeの断片に届けます。 しかし、私はそれが良い習慣だとは思わない。このエラーを処理するために、アクティビティで非常に多くのメンバーを使用しているため、コードは醜いように見えます。 この問題を解決する良い方法はありますか?

+0

投稿コード –

答えて

1

あなたは状態の損失

supportFragmentManager.beginTransaction() 
         .replace(R.id.fragment_holder, new Fragment()) 
         .commitAllowingStateLoss() 

でフラグメントトランザクションをコミットすることで、この問題を回避することができますしかし、あなたは、フラグメントの状態を保持したい場合はonSaveInstanceStateが呼び出された後、あなたは、フラグメントのトランザクションを行うべきではありません。

関連する問題