java.lang.IllegalStateException : 지정된 하위에 이미 상위가 있습니다.


99

조각을 처음 인스턴스화 할 때 조각을 사용하고 있습니다. 하지만 두 번째로이 예외가 발생했습니다. 오류가 발생한 줄을 찾을 수 없습니까?

 04-04 08:51:54.320: E/AndroidRuntime(29713): FATAL EXCEPTION: main
    04-04 08:51:54.320: E/AndroidRuntime(29713): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3013)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.view.ViewGroup.addView(ViewGroup.java:2902)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.view.ViewGroup.addView(ViewGroup.java:2859)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.view.ViewGroup.addView(ViewGroup.java:2839)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.NoSaveStateFrameLayout.wrap(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.BackStackRecord.run(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.FragmentManagerImpl$1.run(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.os.Handler.handleCallback(Handler.java:587)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.os.Handler.dispatchMessage(Handler.java:92)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.os.Looper.loop(Looper.java:132)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.app.ActivityThread.main(ActivityThread.java:4126)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at java.lang.reflect.Method.invokeNative(Native Method)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at java.lang.reflect.Method.invoke(Method.java:491)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at dalvik.system.NativeStart.main(Native Method)

내 목록 조각의 요소를 클릭 할 때 수행하는 작업은 다음과 같습니다.

// If we are not currently showing a fragment for the new
 // position, we need to create and install a new one.
 RouteSearchFragment df = RouteSearchFragment.newInstance(index);

 // Execute a transaction, replacing any existing fragment
 // with this one inside the frame.
 FragmentTransaction ft = fragmentManager.beginTransaction();
 ft.replace(R.id.details_full, df);
 ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
 ft.commit();

처음으로 Ok 일 때는 list에서 element2를 클릭해도 괜찮습니다. 하지만 element1로 돌아 가면이 버그가 생겼습니다.

모두 감사합니다!


layoutView.removeAllViews ();를 호출해야합니다. 이전 레이아웃보기를 추가
K ρяσѕρєя

@imrankhan 잘못되었습니다! 모두 제거하지 않고 추가 할 수 있습니다. 가장 중요한 부분이 누락되어 스택 트레이스에는 사용자 정의 패키지가 없기 때문에, 나는 당신이 ... 그것은 단계별로 몇 가지 코드를 분리하고 검사 제안
WarrenFaith

1
자세한 내용을 추가합니다. 보이 시나요?
haythem souissi

이 RouteSearchFragment 클래스는 무엇입니까 ?? Android 문서에서 참조를 찾을 수 없습니다. 클래스 정의도 업데이트하십시오.
멍청한 놈

답변:


36

클래스 OnCreateView에서 재정의 할 때RouteSearchFragment

if(view != null) {
    return view; 
}

코드 세그먼트?

그렇다면 return 문을 제거하면 문제가 해결됩니다.

뷰 데이터를 다시 생성하지 않으려면 코드를 유지하고 뷰를 반환 할 수 있으며 onDestroyView () 메서드는 다음과 같이 부모에서이 뷰를 제거합니다.

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

5
@Override public void onDestroyView () {super.onDestroyView (); ViewGroup parentViewGroup = (ViewGroup) mRoutesSearchViewContainer.getParent (); if (null! = parentViewGroup) {parentViewGroup.removeView (mRoutesSearchViewContainer); }}
haythem souissi 2014-04-04

@Medo : 이것에 대해 간단히 설명해 주시겠습니까? logcat에 동일한 오류가 표시됩니다. "return 문을 제거하면 문제가 해결 될 것"이라는 제안이 있었지만 onCreateView () 메서드에서 View 개체를 반환해야합니다. 당신은 설명의 스 니펫 코드를 제공 할 수 있습니다. 감사합니다.
Krishna Prasad 2013

@Krishna 평상시처럼 팽창하고 뷰를 반환하십시오. 전체 if 문을 건너 뛸 수 있습니다.
Medo 2013

65
나를 위해 그냥 교체 return inflater.inflate(R.layout.fragment_search, container);해야했습니다return inflater.inflate(R.layout.fragment_search, container, false);
Sufian 2014

370

이전 질문에 게시해서 미안하지만 완전히 다른 솔루션을 사용하여 수정할 수있었습니다. 이 예외가 발생했지만 onCreatView 재정의의 첫 번째 줄을 다음과 같이 변경했습니다.

View result = inflater.inflate(R.layout.customer_layout, container);

...이에:

View result = inflater.inflate(R.layout.customer_layout, container, false);

왜 그런지 모르겠지만 세 번째 매개 변수로 부울을 허용하는 재정의를 사용하여 수정했습니다. 새로 생성 된 뷰의 부모로 "컨테이너"를 사용하지 않도록 조각 및 / 또는 활동에 지시한다고 생각합니다.


53
미안해하지 마세요. 이것은 저와 다른 많은 사람들에게 매우 유용했습니다. 감사!
코드

덕분에 많이 나는 이것을 잊고이 답변에 돌아 오는 유지
noloman

@Patrick, 첫 번째는 확장 된 뷰를 컨테이너에 연결하고 거짓 플래그를 추가하면 확장 된 뷰를 컨테이너에 추가하지 않을 것임을 지정합니다.
Ne0

그리고 나는 계속이 포스트로 돌아와서 이것이 답이라는 것을 알게되었습니다. :)
noloman

45

나는이 문제에 여러 번 직면했습니다. 이 문제를 해결하려면 다음 코드를 추가하십시오.

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

감사


이 솔루션에 감사드립니다 :) 나는 이것을 해결하기 위해 인플레이터를 사용할 수없는 매우 특정한 경우가 있습니다. 당신은 나에게 많은 시간 저장
보얀

죄송합니다. 제가 안드로이드를 처음 접했기 때문에 잘 이해가되지 않습니다.
Zin Win Htet 2014 년

view.getParent ();에서 복용량보기 개체의 출처는 어디입니까?
Zin Win Htet 2014 년

Cristy YG : View 인스턴스를 전역 변수로 사용하고 위의 전역 변수에서 레이아웃 xml을 확장합니다. 당신은 나를 따르고 있습니까?
Hardik

예,보기 인스턴스는 글로벌로 선언됩니다.
Hardik

35

이 진술이 있으면 ..

View view = inflater.inflate(R.layout.fragment1, container);//may be Incorrect 

그럼 이걸 해봐 .. 거짓을 세번째 인자로 추가해 .. 도움이 될지도 몰라 ..

View view = inflater.inflate(R.layout.fragment1, container, false);//correct one

21

이 코드가 조각에 있었는데 다시이 조각으로 돌아 가려고하면 충돌이 발생했습니다.

if (mRootView == null) {
    mRootView = inflater.inflate(R.layout.fragment_main, container, false);
} 

이 스레드에 대한 답변을 모은 후 mRootView의 부모가 여전히 mRootView를 자식으로 가지고 있음을 깨달았습니다. 그래서 이것은 내 수정이었습니다.

if (mRootView == null) {
    mRootView = inflater.inflate(R.layout.fragment_main, container, false);
} else {
    ((ViewGroup) mRootView.getParent()).removeView(mRootView);
}

도움이 되었기를 바랍니다


2
+1이 도움이되었습니다. 활동은 유지되지만 조각 관리자가 새 조각을 맨 위에 추가하는 경우 특히 그렇습니다. 첫 번째 조각으로 돌아갈 때 이전 루트 뷰가 제거되었는지 확인해야합니다. 감사!
Bundeeteddee 2013

많은 도움이되었습니다. 3 일 동안 그 해결책을 찾았습니다. 간단하고 예쁜 대답.
Zin Win Htet 2014 년

와! 마침내 그것은 나를 위해 일했습니다! 만족스러운 솔루션. 감사!
avisper

왜 "(ViewGroup) mRootView.getParent ()). removeView (mRootView);"라는 근거가 없습니다. "<WhateverIsParentViewGroupName> .removeView (mRootView)"를 직접 호출하는 것과는 대조적으로 작동합니다. 그러나 이것은 나에게도 작동합니다. Android 8.0 및 9.0에서 테스트 중입니다. 감사합니다 꽃 봉오리 ^
Khay

16

또한 onCreateView ()에 의해 반환 된 뷰가 팽창 된 뷰가 아닐 때도 발생합니다.

예:

View rootView = inflater.inflate(R.layout.my_fragment, container, false);

TextView textView = (TextView) rootView.findViewById(R.id.text_view);
textView.setText("Some text.");

return textView;

고치다:

return rootView;

대신에:

return textView; // or whatever you returned

감사! 그것은 나를 도왔다!
Sudheesh Mohan 2015

5

이 문제가 있었는데 Java 코드로 해결할 수 없었습니다. 문제는 내 XML에있었습니다.

컨테이너에 textView를 추가하려고했지만 LinearLayout 안에 textView를 래핑했습니다.

다음은 원본 xml 파일입니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:gravity="center_vertical"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:textColor="#fff"
        android:background="?android:attr/activatedBackgroundIndicator"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

</LinearLayout>

이제 LinearLayout이 제거되었습니다.

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:gravity="center_vertical"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:textColor="#fff"
        android:background="?android:attr/activatedBackgroundIndicator"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

이것은 나에게별로 보이지 않았지만 트릭을 수행했으며 Java 코드를 전혀 변경하지 않았습니다. 그것은 모두 xml에있었습니다.


2

당신은을 추가 View으로 layout만보기는 이미 다른입니다 layout. 보기는 둘 이상의 위치에있을 수 없습니다.


내 질문에 더 자세한 정보를 추가했습니다. 볼 수 있습니까?
haythem souissi

1

이 솔루션이 도움이 될 수 있습니다.

public class FragmentItem extends Android.Support.V4.App.Fragment
{
    View rootView;
    TextView textView;

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (rootView != null) 
        {
            ViewGroup parent = (ViewGroup)rootView.Parent;
            parent.RemoveView(rootView);
        } else {
            rootView = inflater.Inflate(Resource.Layout.FragmentItem, container, false);
            textView = rootView.FindViewById<TextView>(Resource.Id.textViewDisplay);            
        }
        return rootView;
    }
}

1
rootView는 초기화하지 않았기 때문에 항상 null이 될 것이라고 생각합니다.
Zin Win Htet 2014 년

rootView는 항상 null 일
Thinsky

1

내가 설정하여 그것을 해결 attachToRootinflater.inflate()false.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_overview, container, false);
    return view;
}

0

xml 파일에서 layout_width 및 layout_height를 wrap_content에서 match_parent로 설정해야합니다. 나를 위해 고정되었습니다.

<FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.