web-dev-qa-db-ja.com

指定された子は既に親を持っています。あなたは最初に子供の親のremoveView()を呼び出さなければなりません(Android)

私のアプリでは、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);
        }
    }
}

私はこの質問が以前に尋ねられたことを知っています、しかしそれは私の場合には役に立ちませんでした。

111
blackst0ne

エラーメッセージはあなたがすべきことを言っています。

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

ここで私は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));
39
suku

単にattachtoroot引数をfalseとして渡します。

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

私はこのメッセージを得ました。falseの代わりにtrueにattach to rootを使ってフラグメントをコミットしようとしています。

return inflater.inflate(R.layout.fragment_profile, container, true)

した後:

return inflater.inflate(R.layout.fragment_profile, container, false)

出来た。

9
Hudson Pereira

他の解決策がうまくいかない場合:

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

フラグメントのonCreateViewから何が返されているかを確認してください。それはシングルビューかビューグループですか。私の場合は、フラグメントのxmlのルートにviewpagerを持っていて、viewpagerを返していました。レイアウトにviewgroupを追加したとき、viewpager(view)ではなくviewgroupを返すように更新しました。

4
blackHawk

私の場合、問題は私が<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()を削除することで問題解決に役立ちました。

2
soshial

frameLayout.addView(bannerAdView); <-----この行でエラーが発生した場合は以下のようにしてください。

if (bannerAdView.getParent() != null)

  ((ViewGroup) bannerAdView.getParent()).removeView(bannerAdView);

   frameLayout.addView(bannerAdView);     <------ now added view
2
Mayur Dabhi
if(tv!= null){
    ((ViewGroup)tv.getParent()).removeView(tv); // <- fix
}
1
Chandan Bera

私は別の修正を見つけました:

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

ここで私はちょうどビューが親を持っているかどうかをチェックし、それが新しいダイアログを作成していない場合はcontentViewを設定し、私の "createAlgorithmDialog()"メソッドでダイアログを表示します。

これはまた、onClickListenerで正と負のボタン([OK]と[キャンセル]ボタン)を設定します。

1
Joshua Orotayo

以下のコードは私のためにそれを解決しました:

@Override
public void onDestroyView() {
    if (getView() != null) {
        ViewGroup parent = (ViewGroup) getView().getParent();
        parent.removeAllViews();
    }
    super.onDestroyView();
}

注:エラーは私のフラグメントクラスからのもので、このようにonDestroyメソッドをオーバーライドすることで解決できました。

1
AK 12

私のエラーはこのようにビューを定義することでした:

view = inflater.inflate(R.layout.qr_fragment, container);

欠けていました:

view = inflater.inflate(R.layout.qr_fragment, container, false);
1
Pedro Molina

このメソッドを使用して、ビューに子があるかどうかを確認できます。

public static boolean hasChildren(ViewGroup viewGroup) {
    return viewGroup.getChildCount() > 0;
 }
0
Sofiane Majdoub

私の場合、それは私が他のビューに親によってビューを追加したいときに起こります

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);
0
Maysam R

私の場合は違いました子ビューはすでに親ビューを持っていました私は別の親に親ビューの内側の子ビューを追加しています。以下のコード例

<?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" />
0
Irfan

すでにビューを追加しているか確認してください

if (textView.getParent() == null)
    layout.addView(textView);
0
Dan Alboteanu