2

Activity에있는 Android Youtube Api (ListVideos)를 팔로우했습니다. 나는 이것을 Fragment에서 시도하고있다. 나는 치명적인 예외를 얻고있다 The specified child already has a parent. You must call removeView() on the child's parent first. 나는 다른 사람들이 게시 한 답변을 통해 갔다. 그것은 나를 도울 수 없었다. 아무도 내가보기를 제거해야 할 곳을 말해 줄 수 있습니까?치명적인 예외 : 지정된 자식에 이미 부모가 있습니다

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.video_list_demo, container, true); 

    listFragment = (VideoListFragment) getActivity().getFragmentManager() 
      .findFragmentById(R.id.list_fragment); 
    videoFragment = (VideoFragment) getActivity().getFragmentManager() 
      .findFragmentById(R.id.video_fragment_container); 

    videoBox = view.findViewById(R.id.video_box); 
    closeButton = view.findViewById(R.id.close_button); 

    videoBox.setVisibility(View.INVISIBLE); 

    layout(); 

    return view; 

} 

XML :

<merge xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/container" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<fragment 
    android:id="@+id/list_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.youtube.VideoListDemoActivity$VideoListFragment" /> 

<LinearLayout 
    android:id="@+id/video_box" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom" 
    android:orientation="vertical" > 

    <ImageButton 
     android:id="@+id/close_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:onClick="onClickClose" 
     android:src="@android:drawable/btn_dialog" /> 

    <fragment 
     android:id="@+id/video_fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     class="com.youtube.VideoListDemoActivity$VideoFragment" /> 
</LinearLayout> 
</merge> 

레이아웃()

private void layout() { 
    boolean isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; 

    listFragment.getView().setVisibility(
      isFullscreen ? View.GONE : View.VISIBLE); 
    listFragment.setLabelVisibility(isPortrait); 
    closeButton.setVisibility(isPortrait ? View.VISIBLE : View.GONE); 

    if (isFullscreen) { 
     videoBox.setTranslationY(0); 
     setLayoutSize(videoFragment.getView(), MATCH_PARENT, MATCH_PARENT); 
     setLayoutSizeAndGravity(videoBox, MATCH_PARENT, MATCH_PARENT, 
       Gravity.TOP | Gravity.LEFT); 
    } else if (isPortrait) { 
     setLayoutSize(listFragment.getView(), MATCH_PARENT, MATCH_PARENT); 
     setLayoutSize(videoFragment.getView(), MATCH_PARENT, WRAP_CONTENT); 
     setLayoutSizeAndGravity(videoBox, MATCH_PARENT, WRAP_CONTENT, 
       Gravity.BOTTOM); 
    } else { 
     videoBox.setTranslationY(0); 
     int screenWidth = dpToPx(getResources().getConfiguration().screenWidthDp); 
     setLayoutSize(listFragment.getView(), screenWidth/4, MATCH_PARENT); 
     int videoWidth = screenWidth - screenWidth/4 
       - dpToPx(LANDSCAPE_VIDEO_PADDING_DP); 
     setLayoutSize(videoFragment.getView(), videoWidth, WRAP_CONTENT); 
     setLayoutSizeAndGravity(videoBox, videoWidth, WRAP_CONTENT, 
       Gravity.RIGHT | Gravity.CENTER_VERTICAL); 
    } 
} 

로그 캣 :

02-18 22:18:56.431: E/AndroidRuntime(7936): FATAL EXCEPTION: main 
02-18 22:18:56.431: E/AndroidRuntime(7936): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.view.ViewGroup.addViewInner(ViewGroup.java:3389) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.view.ViewGroup.addView(ViewGroup.java:3260) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.view.ViewGroup.addView(ViewGroup.java:3205) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.view.ViewGroup.addView(ViewGroup.java:3181) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.os.Handler.handleCallback(Handler.java:615) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.os.Looper.loop(Looper.java:137) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at android.app.ActivityThread.main(ActivityThread.java:4895) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
02-18 22:18:56.431: E/AndroidRuntime(7936):  at dalvik.system.NativeStart.main(Native Method) 
+0

당신은'layout()'을 게시 할 수 있습니까? 거기에서 초기화 된 견해가 있습니까? – Raghunandan

+0

지난 며칠 사이에이 문제가 많이 제기되고있는 것으로 보입니다. –

+0

@Raghunandan 업데이트 됨! – DroidLearner

답변

3

변화

inflater.inflate(R.layout.video_list_demo, container, true); 

inflater.inflate(R.layout.video_list_demo, container, false); 

하려면 * 문서를 읽어보십시오.

* 단편보기를 직접 부착해서는 안됩니다. 너는 단지 그것을 돌려 보내야한다. 첨부 된 병합 된 뷰를 반환 할 수 없으므로이 경우 병합을 사용할 수 없습니다. FragmentManager는 조각보기를 첨부하고 제거 할시기를 결정합니다.

+0

Fragment에'merge' 태그를 사용하고 있습니다.'false'를 사용했을 때이 메시지를 표시했습니다. 유효한 ViewGroup 루트와 attachToRoot = true만으로 사용할 수 있으므로 true로 설정했습니다. – DroidLearner

+1

조각보기를 반환하면 을 사용할 수 없습니다. 그것은 병합과 함께 작동하지 않습니다. – Leonidos

+0

그래서 더 나아가는 더 좋은 방법은 무엇입니까? – DroidLearner

관련 문제