указанный ребенок уже имеет родителя - PullRequest
7 голосов
/ 09 сентября 2010

Я создал AlertDialog с помощью компоновщика.Он показывает, когда мы вызываем метод show().В этом диалоге у меня есть кнопка cancel .Я могу отменить это диалоговое окно, нажав кнопку отмены.Моя проблема заключается в том, что после того, как я отменил отображение диалогового окна, я больше не могу его отобразитьВыдает исключение как:

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 ]

17 голосов
/ 09 сентября 2010

Не показывать тот же диалог, создайте новый.

Это происходит потому, что вы пытаетесь повторно использовать диалоговое окно, которое уже было создано (вероятно, на onCreate) и использовалось один раз. Нет проблем в повторном использовании диалогового окна, но, как и в вопросе, указанный дочерний элемент (представление) уже имеет родителя (диалоговое окно). Вы можете продолжить удаление родительского элемента или создать новый родительский тип, например: *

alertDialog=new AlertDialog(Context);
alertDialog.setView(yourView);
alertDialog.show();
3 голосов
/ 11 января 2013

Вы должны делать это:

AlertDialog.setView(yourView);

Вы можете исправить эту ошибку следующим образом:

if (yourView.getParent() == null) {
    AlertDialog.setView(yourView);
} else {
    yourView = null; //set it to null
    // now initialized yourView and its component again
    AlertDialog.setView(yourView);
}
3 голосов
/ 15 марта 2011

удалить предыдущий диалог перед добавлением нового.Если вы продолжите добавлять новый диалог каждый раз, когда он останется в вашей памяти, и ваше приложение будет расходовать больше энергии.

вызовите remove view или removeAllViews () в макете, в который вы добавляете свой диалог.

1 голос
/ 04 февраля 2015

Переместить весь код компоновщика за пределы метода onCreateDialog.

Например, вот обновленное руководство по Android Dialogs:

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();
...