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


답변

attachtoroot 인수를 false로 전달하십시오.

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


답변

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


답변

내가 가지고 이 메시지 과 같이, 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);