7

AlertDialogビルダーを使用して作成しました。show()メソッドを呼び出すと表示されます。そのダイアログにキャンセルボタンがあります。キャンセル ボタンをクリックすると、そのダイアログをキャンセルできます。私の問題は、ダイアログの表示をキャンセルすると、ダイアログを再度表示できないことです。次のような例外をスローします。

09-09 12:25:06.441: ERROR/AndroidRuntime(2244): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
09-09 12:25:06.441: ERROR/AndroidRuntime(2244):     at android.view.ViewGroup.addViewInner(ViewGroup.java:1970)
09-09 12:25:06.441: ERROR/AndroidRuntime(2244):     at android.view.ViewGroup.addView(ViewGroup.java:1865)
09-09 12:25:06.441: ERROR/AndroidRuntime(2244):     at android.view.ViewGroup.addView(ViewGroup.java:1845)
09-09 12:25:06.441: ERROR/AndroidRuntime(2244):     at com.android.internal.app.AlertController.setupView(AlertController.java:364)
09-09 12:25:06.441: ERROR/AndroidRuntime(2244):     at com.android.internal.app.AlertController.installContent(AlertController.java:205)
09-09 12:25:06.441: ERROR/AndroidRuntime(2244):     at android.app.AlertDialog.onCreate(AlertDialog.java:251)
4

4 に答える 4

19

同じダイアログを表示しないで、新しいダイアログを作成してください。

これは、既に作成されており (おそらく でonCreate)、一度使用されたダイアログを再利用しようとしているために発生しています。ダイアログの再利用に問題はありませんが、質問のように、指定された子 (ビュー) には既に親 (ダイアログ) があります。親を削除して続行するか、次のように新しい親を作成できます。

alertDialog=new AlertDialog(Context);
alertDialog.setView(yourView);
alertDialog.show();
于 2010-09-09T08:37:26.873 に答える
3

You must be doing this:

AlertDialog.setView(yourView);

You can over come this error by:

if (yourView.getParent() == null) {
    AlertDialog.setView(yourView);
} else {
    yourView = null; //set it to null
    // now initialized yourView and its component again
    AlertDialog.setView(yourView);
}
于 2013-01-11T17:02:08.357 に答える
3

新しいダイアログを追加する前に、前のダイアログを削除してください。毎回新しいダイアログを追加し続けると、これはメモリに残り、アプリはより多くのバッテリーを消費します。

ダイアログを追加するレイアウトでremoveviewまたはremoveAllViews()を呼び出します。

于 2011-03-15T06:38:24.567 に答える
1

ビルダーのすべてのコードをonCreateDialogメソッドの外に移動します。

たとえば、更新された Android ダイアログ ガイドは次のとおりです。

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.dialog_fire_missiles)
    .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int id) {
             // Send the positive button event back to the host activity
             mListener.onDialogPositiveClick(NoticeDialogFragment.this);
         }
    })
    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            // Send the negative button event back to the host activity
            mListener.onDialogNegativeClick(NoticeDialogFragment.this);
        }
    });

final Dialog dialog = builder.create();

DialogFragment fragment = new DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Build the dialog and set up the button click handlers
        return dialog;
    }
};
fragment.show();

// and later ...
fragment.show();
于 2015-02-03T23:16:06.130 に答える