Android - У указанного дочернего элемента уже есть родитель. Вы должны сначала вызвать removeView() для родителя дочернего элемента

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

Вот мой лог:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    at android.view.ViewGroup.addViewInner(ViewGroup.java:1976)
    at android.view.ViewGroup.addView(ViewGroup.java:1871)
    at android.view.ViewGroup.addView(ViewGroup.java:1851)
    at com.android.internal.app.AlertController.setupView(AlertController.java:365)
    at com.android.internal.app.AlertController.installContent(AlertController.java:206)
    at android.app.AlertDialog.onCreate(AlertDialog.java:251)
    at android.app.Dialog.dispatchOnCreate(Dialog.java:307)
    at android.app.Dialog.show(Dialog.java:225)
    at com.company.MyApp.MyActivity$7.onItemClick(MyActivity.java:240)
    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
    at android.widget.ListView.performItemClick(ListView.java:3513)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3683)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)

Вот MyActivity.java onCreate(). Видно, что отображается построитель диалогов и ему присваиваются некоторые значения. И myDialogLayout, и myDialogBuilder являются приватными членами класса

@Override
public void onCreate( Bundle savedInstanceState )
{
    // ... a bunch of init code...

    // Create a dialog builder
    myDialogLayout = getLayoutInflater().inflate(R.layout.leaving, null);
    myDialogBuilder = new AlertDialog.Builder(this)
        .setTitle("My Title")
        .setView(myDialogLayout)
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener()
        {
            public void onClick( DialogInterface dialog, int which ) {}
        });

    // ... more code ...
}

Позже, когда в моей Activity нажимается определенная кнопка, myDialogBuilder немного настраивается, а затем создается и показывается диалог. myDialog является приватной переменной/членом класса:

// Builder customized a bit
myDialogBuilder 
    .setMessage("custom message here");

// Dialog created from Builder
myDialog = myDialogBuilder.create();

// Dialog shown
myDialog.show();  // <---- MyActivity.java Line: 240

Итак, перейдем к моей проблеме, когда я нажимаю на кнопку, диалог создается успешно. Но после того, как я нажимаю Cancel в диалоге, а затем снова нажимаю кнопку, я получаю ошибку, показанную в журнале. По какой-то причине активность не хочет, чтобы я повторно использовал мой диалог myDialog. Это член класса, поэтому он доступен из обработчика onClick. И myDialog является новым диалогом каждый раз, когда нажимается кнопка, потому что он создается с нуля myDialogBuilder.create() каждый раз.

Кто-нибудь знает, в чем проблема? Я также попробовал добавить myDialog.dismiss() при нажатии кнопки Cancel, но это ничего не изменило.

Кроме того, в myDialogBuilder видно, что для представления диалога используется пользовательский XML-макет. Согласно сообщению об ошибке, похоже, что оно хочет, чтобы я использовал removeView(), чтобы удалить представление из использования в диалоге. Но myDialogBuilder.removeView() не является допустимым методом.

9
задан Jake Wilson 6 February 2012 в 21:39
поделиться