단편-지정된 하위에 이미 상위가 있습니다. 먼저 자식의 부모에서 removeView ()를 호출해야합니다.


80

이 오류가 발생합니다. 많은 솔루션을 시도했지만 해결할 수 없었습니다. 도와주세요! 조각을 사용하여 활동에 표면보기와 버튼을 추가해야합니다.

CamActivity.java :

public class CamActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cam);
        
        FragmentManager fm = getSupportFragmentManager();
        
        Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
        
        if(fragment == null) {
            fragment = new CamFragment();
            fm.beginTransaction()
            .add(R.id.fragmentContainer, fragment)
            .commit();
        }
    }
}

CamFragment.java :

public class CamFragment extends Fragment {

    private static final String TAG = "CamFragment";
    
    private Camera mCamera;
    private SurfaceView mSurfaceView;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){
    View v = inflater.inflate(R.layout.camera_fragment, parent);
    
    Button capturePic = (Button)v.findViewById(R.id.img_capture);
    capturePic.setOnClickListener(new View.OnClickListener() {
        
        @Override
        public void onClick(View v) {
            getActivity().finish();
        }
    });
    
    mSurfaceView = (SurfaceView)v.findViewById(R.id.surfaceView1);
    return v;
}

}

오류:

04-18 13:24:12.735: E/AndroidRuntime(6321): FATAL EXCEPTION: main
04-18 13:24:12.735: E/AndroidRuntime(6321): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pack.camdictionary/com.pack.camdictionary.CamActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1728)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1747)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.app.ActivityThread.access$1500(ActivityThread.java:155)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.os.Handler.dispatchMessage(Handler.java:130)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.os.Looper.loop(SourceFile:351)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.app.ActivityThread.main(ActivityThread.java:3814)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at java.lang.reflect.Method.invokeNative(Native Method)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at java.lang.reflect.Method.invoke(Method.java:538)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:659)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at dalvik.system.NativeStart.main(Native Method)
04-18 13:24:12.735: E/AndroidRuntime(6321): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.view.ViewGroup.addViewInner(ViewGroup.java:2007)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.view.ViewGroup.addView(ViewGroup.java:1902)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.view.ViewGroup.addView(ViewGroup.java:1859)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.view.ViewGroup.addView(ViewGroup.java:1839)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:570)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1166)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.app.Activity.performStart(Activity.java:3837)
04-18 13:24:12.735: E/AndroidRuntime(6321):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1701)
04-18 13:24:12.735: E/AndroidRuntime(6321):     ... 11 more

예외가 발생했을 때. 에 capturePic 클릭하거나 전.
maddy d

어디에서 getParent를 호출해야합니까 ?? 그 전에 @maddy
비벡

1
activity_camXML 파일 게시
maddy d

답변:


198

교체하려고

View v = inflater.inflate(R.layout.camera_fragment, parent);

View v = inflater.inflate(R.layout.camera_fragment, parent, false);

또는

View v = inflater.inflate(R.layout.camera_fragment, null);

10
null을 부모로 전달하는 것을 피하고 그가 언급 한 첫 번째 옵션을 사용하십시오
Dominic

7
@sudocoder 왜 당신의 대답을?. 부모는 연결할 리소스를 확장하는 계층 구조의 루트보기이며, LayoutInflater는 제공된 루트에 확장 된보기를 자동으로 연결하려고 시도합니다. 그러나 프레임 워크는 루트에 대해 null을 전달하면 앱이 충돌하지 않도록이 시도를 우회하는지 확인합니다. 여기에 아무것도 전달하지 않으면 프레임 워크에 팽창 된 xml의 부모보기를 알 수 없습니다.
Elltz 2014


감사합니다! 당신은 내 시간을 절약했습니다.
작별

8

이 질문은 이미 답변되었지만 여전히 세 번째 매개 변수로 false 를 추가하는 이유를 추가하고 싶습니다 .

inflate () 메서드는 세 가지 인수를 사용합니다.

  • 확장하려는 레이아웃의 리소스 ID입니다.
  • 확장 된 레이아웃의 부모가 될 ViewGroup입니다. 컨테이너를 전달하는 것은 시스템이 확장 된 레이아웃의 루트보기에 레이아웃 매개 변수를 적용하기 위해 중요합니다.
  • 팽창하는 동안 팽창 된 레이아웃이 ViewGroup (두 번째 매개 변수)에 첨부되어야하는지 여부를 나타내는 부울입니다. (이 경우 시스템이 이미 확장 된 레이아웃을 컨테이너에 삽입하고 있기 때문에 false입니다. true를 전달하면 최종 레이아웃에 중복 된보기 그룹이 생성됩니다.)

출처 : http://developer.android.com/guide/components/fragments.html


7

제 경우 setTransition()에는 FragmentTransaction. 아래 코드는 나를 위해 일했습니다.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {

        if(this::rootView.isInitialized){
            if(rootView.getParent() != null){
                (rootView.getParent() as ViewGroup).endViewTransition(rootView)
            }
            return this.rootView

        }

        ...

}

이는 조각 간을 반복적으로 전환 할 때 발생하며, 진행중인 전환으로 인해 뷰가 부모에서 실제로 분리 될 시간을 얻지 못합니다.


예, 확인할 수 있습니다. 내 특정 경우에 일부 내 프래그먼트에는 Google 표시와 같은 무겁고 복잡한 UI가 MapView있으며 사용자는 이러한 프래그먼트 사이를 자주 탐색 할 수 있습니다. 뷰를 완전히 다시 만드는 것은 매번 번거롭기 때문에 뷰 캐싱을 수행하고 있습니다 (Fragment에서 뷰의 인스턴스를 유지하고에서 반환 onCreateView). 그러나 이러한 두 조각 사이의 전환 애니메이션으로 인해 두 뷰가 잠시 공존하고 사용자가 충분히 빨리 뒤로 이동하면 충돌이 발생합니다. 그래서 전화 endViewTransition가 해결책입니다. 감사합니다. +1할만한 가치가 있습니다.
Mackovich

또한 부수적으로 이상하게도 내 문제는 현재 Android 9를 실행하는 HUAWEI 기기에만 관련된 것입니다.하지만이 문제는 Nexus 5 및 기타 관련없는 기기에서 재현 될 수 있습니다. 왜, 나는 EMUI OS / 화웨이에 적절한 애니메이션 구현 문제가 그것을 만들이있을 수 있습니다 ... 모르는 것을 쉽게 그렇게 자주 일이?
Mackovich

이 답변은 황금입니다
coolcool1994

5

API 26.0.2를 사용하고 있으며 제 경우에는 조각에 설정된 사용자 지정 애니메이션으로 인해 충돌이 발생했습니다. 사용자 지정 애니메이션 설정 호출을 주석 처리하여 문제를 해결했습니다.

fragmentTransaction.setCustomAnimations (android.R.anim.fade_in, android.R.anim.fade_out);


의견을 보내 주셔서 감사합니다. 이 링크를 열었지만 답변을 놓쳤습니다. 이것을 디버그하는 데 3 일이 걸렸습니다. 당신의 대답을 보지 못했다면 더 많은 날을 보냈을 것입니다.
Qadir Hussain

setCustomAnimations로이 작업을 수행 할 수있는 방법을 찾았습니까?
Qadir Hussain

@QadirHussain 죄송합니다 Hussain 시도하지 않았습니다.
Satheesh

2

나는 또한이 문제를 만났고 이것이 나의 해결책입니다. 그건 매우 쉬워요

View v;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    if (v == null) {
        v = inflater.inflate(R.layout.camera_fragment, container);
    } else {
        ViewGroup parent = (ViewGroup) v.getParent();
        if (parent != null) {
            parent.removeView(v);
        }
    }
    return v;
}

당신에게 유용하기를 바랍니다



0

참고 용입니다. Android SDK의 문제인 것 같습니다.

SDK 버전 27.0.2에서 @Satheesh와 같은 상황이 발생하고 setCustomAnimation을 제거하려는 시도가 작동하는 것 같습니다. 그러나 setCustomAnimations를 제거하려면 많은 변경이 필요하므로 사용자 정의 애니메이션을 유지하는 것이 좋습니다. 내가 한 일은 SDK를 현재 27.1.1 인 최신 버전으로 업그레이드하는 것입니다. 그리고 그것은 나를 위해 작동합니다.


0

도움이 될 수 있음

           View customView1;
           inflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           customView1= inflater.inflate(R.layout.edit_custom_alert_window, null);     
           try {
                if(customView2.getParent()!=null)
                    ((ViewGroup)customView2.getParent()).removeView(customView2);
            }catch (Exception e){

            }

0

내 코드에 탐색 기능이 있었고 조각 중 하나에서 뒤로 버튼을 클릭했을 때이 오류가 표시되었습니다. nav_graph 에서 관련 작업popUpTo 를 넣을 때 해결되었습니다 . 일부 작업 이 수행되었지만 아무것도 팝업하지 않았습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.