10

アプリを起動すると、 が実行AsyncTaskされてロードされonPostExecutesetContentView新しいレイアウトに追加され、 add によって 2 つのモードを提供する 2 つのボタンを持つフラグメントが追加されますFragmentTransactionFragmentTransaction2 つのモードのいずれかがクリックされると、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 回目に渡されると、新しい置換フラグメントは半透明になります。最初のフラグメントのボタンをもう一度クリックすると、このメソッドが再度呼び出され、問題ありません。

明らかにアプリがクラッシュするのは望ましくないので、これが発生することはありませんが、コードの書き方に何か問題があるように感じます。

4

1 に答える 1

11

私は同じ問題を抱えていました。それは、savedInstanceState があるかどうかを確認せずに、アクティビティの OnCreate にフラグメントをロードしたためでした。そのため、android は最初にすべての古いフラグメントを再度開き、次に OnCreate を実行して、古いものを置き換えずにフラグメント化するため、別のフラグメントに移動すると、上のフラグメントのみが置換され、下のフラグメントは置換されないため、その下のフラグメントが表示されます。

あなたにとってまったく同じことではないかもしれませんが、それを理解するのに役立つかもしれません.

于 2013-06-30T06:39:08.960 に答える