指定的孩子已经有一个父母。 您必须先调用父级的removeView()(Android)

在我的应用程序中,我不得不经常在两个布局之间切换。 错误发生在下面的布局中。

当我的布局第一次被调用,没有发生任何错误,一切都很好。 当我然后调用不同的布局(一个空白的),然后再次调用我的布局,它给了我以下错误:

> FATAL EXCEPTION: main > java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

我的布局代码如下所示:

  tv = new TextView(getApplicationContext()); // are initialized somewhere else et = new EditText(getApplicationContext()); // in the code private void ConsoleWindow(){ runOnUiThread(new Runnable(){ @Override public void run(){ // MY LAYOUT: setContentView(R.layout.activity_console); // LINEAR LAYOUT LinearLayout layout=new LinearLayout(getApplicationContext()); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); // TEXTVIEW layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN // EDITTEXT et.setHint("Enter Command"); layout.addView(et); } } } 

我知道这个问题之前已经被问过了,但是对我来说并没有帮助。

错误消息说明你应该做什么。

 // TEXTVIEW if(tv.getParent()!=null) ((ViewGroup)tv.getParent()).removeView(tv); // <- fix layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN // EDITTEXT 

我来到这里search我的回收查看错误,但解决scheme没有工作(显然)。 我已经写了原因和它的解决scheme,以回收的情况下。 希望它可以帮助别人。

如果在onCreateViewHolder()出现错误,则按照以下方法执行:

 layoutInflater = LayoutInflater.from(context); return new VH(layoutInflater.inflate(R.layout.single_row, parent)); 

相反它应该是

 return new VH(layoutInflater.inflate(R.layout.single_row, null)); 

我发现另一个修复:

 if (mView.getParent() == null) { myDialog = new Dialog(MainActivity.this); myDialog.setContentView(mView); createAlgorithmDialog(); } else { createAlgorithmDialog(); } 

在这里,我只是有一个if语句检查视图是否有父项,如果没有创build新对话框,请在我的“createAlgorithmDialog()”方法中设置contentView并显示对话框。

这也使用onClickListeners设置了正面和负面的button(ok和cancelbutton)。

在我的情况下,这个问题是由于我正在使用<merge>布局来扩充父视图的事实。 在这种情况下, addView()导致崩溃。

 View to_add = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, true); // parent_layout.addView(to_add); // THIS CAUSED THE CRASH 

删除addView()帮助解决了这个问题。

只需将attachtoroot参数作为false即可

 View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);