指定的孩子已经有一个父母。 您必须先调用父级的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);