development

지정된 자식에 이미 부모가 있습니다.

big-blog 2020. 7. 2. 07:15
반응형

지정된 자식에 이미 부모가 있습니다. 먼저 자녀의 부모에서 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

내 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);

내가 가지고 이 메시지 과 같이, false 대신 true로 뿌리에 부착 사용하여 조각을 커밋하는 동안을 :

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가 있었고 레이아웃에 viewgroup을 추가 할 때 viewpager (view)가 아닌 viewgroup을 반환해야한다고 업데이트하지 않았습니다.


frameLayout.addView (bannerAdView); <-----이 줄에 오류가 발생하면 다음과 같이하십시오.

if (bannerAdView.getParent() != null)

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

   frameLayout.addView(bannerAdView);     <------ now added view

내 오류는 다음과 같이 뷰를 정의했습니다.

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

누락되었습니다 :

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

In my case the problem was caused by the fact that I was inflating parent View with <merge> layout. In this case, addView() caused the crash.

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

Removing addView() helped to solve the problem.


if(tv!= null){
    ((ViewGroup)tv.getParent()).removeView(tv); // <- fix
}

In my case it happens when i want add view by parent to other view

View root = inflater.inflate(R.layout.single, null);
LinearLayout lyt = root.findViewById(R.id.lytRoot);
lytAll.addView(lyt);  // ->  crash

you must add parent view like this

View root = inflater.inflate(R.layout.single, null);
LinearLayout lyt = root.findViewById(R.id.lytRoot);
lytAll.addView(root);

I found another fix:

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

Here i just have an if statement check if the view had a parent and if it didn't Create the new dialog, set the contentView and show the dialog in my "createAlgorithmDialog()" method.

This also sets the positive and negative buttons (ok and cancel buttons) up with onClickListeners.


check if you already added the view

if (textView.getParent() == null)
    layout.addView(textView);

The code below solved it for me:

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

Note: The error was from my fragment class and by overriding the onDestroy method like this, I could solve it.


You can use this methode to check if a view has children or not .

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

My case was different the child view already had a parent view i am adding the child view inside parent view to different parent. example code below

<?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>

And i was inflating this view and adding to another LinearLayout, then i removed the LinaarLayout from the above layout and its started working

below code fixed the issue:

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

참고URL : https://stackoverflow.com/questions/28071349/the-specified-child-already-has-a-parent-you-must-call-removeview-on-the-chil

반응형