Я знаю, что есть десятки вопросов об этой ошибке, но ни одно из предложенных решений, похоже, не применимо к моей проблеме, по крайней мере то, что я вижу.
Вот мой лог:
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()
не является допустимым методом.