私のアプリでは、2つのレイアウトを頻繁に切り替える必要があります。下記のレイアウトでエラーが発生しています。
私のレイアウトが初めて呼び出されるときには、エラーは発生せず、すべて問題ありません。その後、別のレイアウト(空白のレイアウト)を呼び出し、その後、もう一度レイアウトを呼び出すと、次のエラーが表示されます。
> 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
ここで私は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);
私はこのメッセージを得ました。falseの代わりにtrueにattach to rootを使ってフラグメントをコミットしようとしています。
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から何が返されているかを確認してください。それはシングルビューかビューグループですか。私の場合は、フラグメントのxmlのルートにviewpagerを持っていて、viewpagerを返していました。レイアウトにviewgroupを追加したとき、viewpager(view)ではなくviewgroupを返すように更新しました。
私の場合、問題は私が<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()
を削除することで問題解決に役立ちました。
frameLayout.addView(bannerAdView); <-----この行でエラーが発生した場合は以下のようにしてください。
if (bannerAdView.getParent() != null)
((ViewGroup) bannerAdView.getParent()).removeView(bannerAdView);
frameLayout.addView(bannerAdView); <------ now added view
if(tv!= null){
((ViewGroup)tv.getParent()).removeView(tv); // <- fix
}
私は別の修正を見つけました:
if (mView.getParent() == null) {
myDialog = new Dialog(MainActivity.this);
myDialog.setContentView(mView);
createAlgorithmDialog();
} else {
createAlgorithmDialog();
}
ここで私はちょうどビューが親を持っているかどうかをチェックし、それが新しいダイアログを作成していない場合はcontentViewを設定し、私の "createAlgorithmDialog()"メソッドでダイアログを表示します。
これはまた、onClickListenerで正と負のボタン([OK]と[キャンセル]ボタン)を設定します。
以下のコードは私のためにそれを解決しました:
@Override
public void onDestroyView() {
if (getView() != null) {
ViewGroup parent = (ViewGroup) getView().getParent();
parent.removeAllViews();
}
super.onDestroyView();
}
注:エラーは私のフラグメントクラスからのもので、このようにonDestroyメソッドをオーバーライドすることで解決できました。
私のエラーはこのようにビューを定義することでした:
view = inflater.inflate(R.layout.qr_fragment, container);
欠けていました:
view = inflater.inflate(R.layout.qr_fragment, container, false);
このメソッドを使用して、ビューに子があるかどうかを確認できます。
public static boolean hasChildren(ViewGroup viewGroup) {
return viewGroup.getChildCount() > 0;
}
私の場合、それは私が他のビューに親によってビューを追加したいときに起こります
View root = inflater.inflate(R.layout.single, null);
LinearLayout lyt = root.findViewById(R.id.lytRoot);
lytAll.addView(lyt);
このように親ビューを追加する必要があります
View root = inflater.inflate(R.layout.single, null);
LinearLayout lyt = root.findViewById(R.id.lytRoot);
lytAll.addView(root);
私の場合は違いました子ビューはすでに親ビューを持っていました私は別の親に親ビューの内側の子ビューを追加しています。以下のコード例
<?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" />
すでにビューを追加しているか確認してください
if (textView.getParent() == null)
layout.addView(textView);