9

アクティビティがあり、その中にダイアログを表示する必要があります。ここではすべてが正常に機能します。ActivityのonCreateDialogメソッドをオーバーライドしました。コードは次のとおりです。

@Override
protected Dialog onCreateDialog(int dialog)
{
    if(dialog == 10)
    {
        if(waitDialog != null)
            waitDialog.dismiss();

        dialogCreated = true;
        waitDialog = CreateWaitDialog(this); 
        return waitDialog;
    }
    else
        return new Dialog(this);
}

ここで、CreateWaitDialogはダイアログを作成するカスタムメソッドであり、waitDialogは静的変数です。

showDialog(10)を呼び出してダイアログを表示しています

すべてのコードは正常に実行されています。

ダイアログが表示されたら、を呼び出してダイアログを閉じます。

if(waitDialog != null)
    waitDialog.hide();

そして、アクティビティが破壊されたときにそれを却下します。

if(dialogCreated)
        dismissDialog(10);
    super.onDestroy();

閉店し、すべてが素晴らしいです。しかし、デバイスの向きを変更してアクティビティを再作成すると、自分で再びポップアップします。私はshowDialogなどを呼び出していません。ポップアップしているだけです。

4

3 に答える 3

11

これは Activity とonCreateDialogの定義された動作だと思います:

アクティビティによって管理 (保存および復元) されるダイアログを作成するためのコールバック。デフォルトの実装では、互換性のために onCreateDialog(int) を呼び出します。HONEYCOMB 以降をターゲットにしている場合は、代わりに DialogFragment を使用することを検討してください。

showDialog(int) を使用すると、アクティビティは最初にこのメソッドを呼び出し、その後ハングアップします。このメソッドで作成されたダイアログは、表示されているかどうかを含め、自動的に保存および復元されます。

アクティビティでダイアログの保存と復元を管理したい場合は、このメソッドをオーバーライドして、showDialog(int) に渡される ID を処理する必要があります。

onDestroy は、アクティビティのライフサイクルで遅すぎてダイアログを閉じることができないと思います。私の推測では、アクティビティがダイアログを onSaveInstanceState 内に保存していると思います。

super.onSaveInstanceState を呼び出す前に onSaveInstanceState 内のダイアログを閉じようとすると、Android が保存して復元しようとする前にダイアログが閉じられます。

@Override
onSaveInstanceState(Bundle outstate) {

    dismissDialog(10);  
    super.onSaveInstanceState(outstate);
}
于 2012-10-24T19:17:43.030 に答える
6

super.onDismiss() を呼び出さずに onDismiss() をオーバーライドしたため、同様の問題が発生しました。アクティビティが再作成されたときにダイアログが再度表示される場合は、同じ間違いをしていないかどうかを確認することをお勧めします。

于 2014-06-30T00:09:10.870 に答える
3

アプリがダイアログの保存と復元を続行しないようにする場合は、Activity.removeDialog(int id) を呼び出します。

于 2013-09-17T18:51:31.550 に答える