在我的应用程序中,我必须经常在两个布局之间切换。错误发生在下面发布的布局中。
第一次调用我的布局时,没有发生任何错误,一切都很好。当我再调用一个不同的布局(一个空白的布局),然后再次调用我的布局时,它会给我以下错误:
> 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
检查您是否已添加视图
if (textView.getParent() == null)
layout.addView(textView);
下面的代码为我解决了这个问题:
@Override
public void onDestroyView() {
if (getView() != null) {
ViewGroup parent = (ViewGroup) getView().getParent();
parent.removeAllViews();
}
super.onDestroyView();
}
注意:错误来自我的片段类,并通过覆盖onDestroy方法,我可以解决它。
if(tv!= null){
((ViewGroup)tv.getParent()).removeView(tv); // <- fix
}
在我的情况下,当我想通过父级添加视图到其他视图时,它会发生
View root = inflater.inflate(R.layout.single, null);
LinearLayout lyt = root.findViewById(R.id.lytRoot);
lytAll.addView(lyt); // -> crash
你必须像这样添加父视图
View root = inflater.inflate(R.layout.single, null);
LinearLayout lyt = root.findViewById(R.id.lytRoot);
lytAll.addView(root);
您可以使用此方法检查视图是否包含子项。
public static boolean hasChildren(ViewGroup viewGroup) {
return viewGroup.getChildCount() > 0;
}
我的情况不同,子视图已经有父视图我将父视图中的子视图添加到不同的父视图。示例代码如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/lineGap"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black1"
android:layout_gravity="center"
android:gravity="center"
/>
</LinearLayout>
我正在膨胀这个视图并添加到另一个LinearLayout,然后我从上面的布局中删除了LinaarLayout并开始工作
下面的代码修复了问题:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/black1" />
我来到这里是用我的recyclerview搜索错误,但解决方案不起作用(显然)。在Recyclerview的情况下,我已经为它写了原因和解决方案。希望它可以帮助某人。
如果在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));
只需将attachtoroot参数传递为false即可
View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);
我尝试使用attach to root to true而不是false来提交此消息,如下所示:
return inflater.inflate(R.layout.fragment_profile, container, true)
做完之后:
return inflater.inflate(R.layout.fragment_profile, container, false)
有效。
如果其他解决方案不起作用:
View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false);
检查你从onCreateView返回的片段是单视图还是视图组?在我的情况下,我有viewpager在片段的xml的根,我正在返回viewpager,当我在布局中添加viewgroup我没有更新,我现在必须返回viewgroup,而不是viewpager(视图)。
frameLayout.addView(bannerAdView); <-----如果你在这一行得到错误,请执行以下操作。
if (bannerAdView.getParent() != null)
((ViewGroup) bannerAdView.getParent()).removeView(bannerAdView);
frameLayout.addView(bannerAdView); <------ now added view
在我的情况下,问题是由于我用<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()
有助于解决问题。
我的错误是定义了这样的视图:
view = inflater.inflate(R.layout.qr_fragment, container);
它丢失了:
view = inflater.inflate(R.layout.qr_fragment, container, false);
我找到了另一个修复:
if (mView.getParent() == null) {
myDialog = new Dialog(MainActivity.this);
myDialog.setContentView(mView);
createAlgorithmDialog();
} else {
createAlgorithmDialog();
}
这里我只有一个if语句检查视图是否有父项,如果没有创建新对话框,请设置contentView并在我的“createAlgorithmDialog()”方法中显示对话框。
这也使用onClickListeners设置正负按钮(确定和取消按钮)。