3

解決策を探しましたが、これは一般的な問題ではないようです。

アプリがサーバーに接続している間に不確定なダイアログ スピナーを表示し、そのダイアログをクリアして、要求が完了したときに別のダイアログを表示したいと考えています。Fragment互換パッケージを使用しています。問題は、2 番目のダイアログが表示される前にスピナーが削除されていないことです。

ダイアログを表示し、現在のダイアログを削除するコードは次のとおりです。

void displayDialog(int type, String message) {
    Log.i(logTag, "displayDialog: " + type);
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
        Log.i(logTag, "removing previous dialog");
        ft.remove(prev); //TODO maybe use ((DialogFragment)dialog).dismiss(); ?
    }
    ft.addToBackStack(null);

    // Create and show the dialog.
    DialogFragment newFragment = DialogHelperFragment.newInstance(type, message);
    newFragment.show(ft, "dialog");
}

このバグのトラブルシューティングに使用している呼び出しコードは次のとおりです。

displayDialog(DialogHelperFragment.DIALOG_PROGRESS, null);
displayDialog(DialogHelperFragment.DIALOG_PURCHASE_SUCCESS, null);

対応する LogCat 出力は次のとおりです。

06-25 13:53:35.497: I/tag(11008): displayDialog: 8
06-25 13:53:35.497: I/tag(11008): displayDialog: 7
06-25 13:53:35.897: I/tag Dialog Helper(11008): Creating Dialog: 8
06-25 13:53:35.907: I/tag Dialog Helper(11008): Creating Dialog: 7

問題はそれです

Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");

最初のダイアログは、displayDialog() が再度呼び出されるまでに作成またはアタッチされていないため、null を返します。

どんなヒントでも非常に役立ちます。

4

2 に答える 2

7

私が探していたのは

getSupportFragmentManager().executePendingTransactions()

ここに示すように。取り引きは急いでいなかったようです。この呼び出しは、トランザクションを急ぎます。私のトランザクションの順序は次のとおりです。

06-26 10:45:43.800: I/tag(3303): displayDialog: 8
06-26 10:45:43.800: I/tag(3303): Previous Dialog Fragment is:null
06-26 10:45:43.810: I/tag(3303): displayDialog: 7
06-26 10:45:43.810: I/tag(3303): Previous Dialog Fragment is:DialogHelperFragment{40b44a78 #0 dialogHelp}
06-26 10:45:43.810: I/tag(3303): removing previous dialog
06-26 10:45:44.220: I/tag Dialog Helper(3303): Creating Dialog: 7

そのため、ダイアログ タイプ 8 は実際に作成される前に削除されます。

同じ問題で困っている方の参考になれば幸いです。

編集

私も削除しなければならなかったようですaddToBackStack(null)

于 2012-06-26T08:53:02.797 に答える
1

申し訳ありませんが、コードを詳しく調べていませんでしたが、FragmentTransaction で「commit」呼び出しを見つけることができませんでした。最後に、これらのトランザクションをコミットする必要があります。

編集:表示と非表示でトランザクションを独自に管理できるDialogFragmentsを使用しているため、代わりにそれを利用する必要があります。

ただし、フラグメントの Dialog オブジェクトで却下を呼び出す必要があります。

于 2012-06-26T06:55:47.520 に答える