アプリを起動すると、 が実行AsyncTask
されてロードされonPostExecute
、setContentView
新しいレイアウトに追加され、 add によって 2 つのモードを提供する 2 つのボタンを持つフラグメントが追加されますFragmentTransaction
。FragmentTransaction
2 つのモードのいずれかがクリックされると、replace メソッドを使用してフラグメントを別のフラグメントに置き換えます。
アプリがクラッシュすると、最初の画面に戻り、2 つのモードを提供する 2 つのボタンが読み込まれます。この場合、いずれかのモードが選択されると、2 番目のフラグメントが読み込まれますが、背景が突然透明になり、下の 2 つのボタンが表示され、クリック可能なままになります。もう一度クリックすると、フラグメントが適切に置き換えられ、下に表示されなくなります。これは奇妙です。何が原因なのか理解できません。
ID が間違っているか、 XML でフラグメントを定義したことが原因である可能性が示唆されました。これらの 2 つの要因はどちらも当てはまりません。
私のコードを以下に示します。
以下に、ロード画面を置き換えます。
@Override
protected void onPostExecute(Void result) {
setContentView(R.layout.activity_main_screen);
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.add(R.id.fragment_container, new ModeFragment())
.commit();
}
その後、ボタンがクリックされると、現在のものを置き換えたいフラグメントを以下のメソッドに渡します。
private void replaceCurrentFragment(Fragment fragment) {
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.fragment_container, fragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(null).commit();
}
これは最初は機能しますが、クラッシュが発生した場合、アプリは最初のフラグメントに戻り、このメソッドが 2 回目に渡されると、新しい置換フラグメントは半透明になります。最初のフラグメントのボタンをもう一度クリックすると、このメソッドが再度呼び出され、問題ありません。
明らかにアプリがクラッシュするのは望ましくないので、これが発生することはありませんが、コードの書き方に何か問題があるように感じます。