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 ... } 

Позже, когда в моей деятельности щелкнули определенную кнопку, 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 

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

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

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

Solutions Collecting From Web of "Android. У указанного дочернего элемента уже есть родитель. Вы должны сначала вызвать removeView () родителя ребенка"

myDialogLayout переменная члена класса? Если это так, то у него уже есть родительский с первого раза, когда вы показываете диалог, тогда вы создаете второе диалоговое окно, которое также пытается стать родителем myDialogLayout . Попробуйте создать новый экземпляр myDialogLayout каждый раз, когда вы открываете диалог.

Это основной пример того, почему рекомендуется использовать методы onCreateDialog () onPrepareDialog ().

Если вы создаете myDialog каждый раз, когда вы нажимаете кнопку, вы пытаетесь присоединить представления из ранее созданного диалогового объекта (старого родителя) к новому диалоговому окну.

Диалог, который был создан, показан и отклонен, нужно просто показать снова, а не полностью воссоздать.

Предполагая, что myDialog является членом класса, попробуйте проверить, является ли myDialog нулевым первым или нет. Если не null, покажите его снова, а не полностью создайте его.

EDIT. Вот пример того, что я имею в виду, используя onPrepareDialog () и onCreateDialog (). On Create создает диалог, и каждый раз, когда он отображается, он подготовлен, и ссылка EditText получена с помощью findViewById и текст очищается. Мы предполагаем, что DIALOG_TEST – это целочисленная константа, а в layout / dialog_test.xml – представление EditText с id edittext.

 @Override protected void onPrepareDialog(int id, Dialog dialog) { switch(id){ case DIALOG_TEST: EditText mEditText = (EditText) dialog.findViewById(R.id.edittext); mEditText.setText(""); break; } } @Override protected Dialog onCreateDialog(int id) { AlertDialog.Builder builder = new AlertDialog.Builder(this); switch(id){ case DIALOG_TEST: LinearLayout layout = (LinearLayout) ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.dialog_test, null); builder.setTitle("Enter Something").setView(layout); return builder.create(); } }