2011-05-17 11 views
39

我使用的是兼容包使用的片段在我的Android應用程序。我已經在運行2.3.3的Nexus One和Google API 2.2仿真器上測試了該應用程序。Android的碎片(與兼容包2.3.3)將創建「指定的孩子已經有一個父錯誤」

當通過佈局XML它的偉大工程(使用片段標籤)將片段。

當動態地添加所述片段成的FrameLayout它沒有成功的片段添加到容器,並引發以下錯誤。

alStateException: The specified child already has a parent. You must call removeView() on the child's parent first 

爲此的完整堆棧跟蹤如下。

05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.view.ViewGroup.addViewInner(ViewGroup.java:1976) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.view.ViewGroup.addView(ViewGroup.java:1871) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.view.ViewGroup.addView(ViewGroup.java:1828) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.view.ViewGroup.addView(ViewGroup.java:1808) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:743) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:933) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:578) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1219) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:380) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.os.Handler.handleCallback(Handler.java:587) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.os.Looper.loop(Looper.java:123) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at android.app.ActivityThread.main(ActivityThread.java:3839) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at java.lang.reflect.Method.invoke(Method.java:507) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
05-17 19:44:03.518: DEBUG/UNHANDLED_EXCEPTION(7735):  at dalvik.system.NativeStart.main(Native Method) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735): FATAL EXCEPTION: main 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.view.ViewGroup.addViewInner(ViewGroup.java:1976) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.view.ViewGroup.addView(ViewGroup.java:1871) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.view.ViewGroup.addView(ViewGroup.java:1828) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.view.ViewGroup.addView(ViewGroup.java:1808) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:743) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:933) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:578) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1219) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:380) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.os.Handler.handleCallback(Handler.java:587) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.os.Looper.loop(Looper.java:123) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at android.app.ActivityThread.main(ActivityThread.java:3839) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at java.lang.reflect.Method.invoke(Method.java:507) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
05-17 19:44:03.528: ERROR/AndroidRuntime(7735):  at dalvik.system.NativeStart.main(Native Method) 

這是我使用的佈局 - FrameLayout是我插入的容器。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <HorizontalScrollView android:layout_height="wrap_content" 
     android:layout_width="wrap_content" android:scrollbars="none" 
     android:id="@+id/activity_phone_tabbedview_scroll"> 

     <LinearLayout android:orientation="horizontal" 
      android:layout_height="wrap_content" android:layout_width="fill_parent"> 

      <Button android:text="Something" android:layout_height="wrap_content" 
       android:layout_width="wrap_content" android:background="@drawable/tabs" 
       android:textColor="@color/White" android:paddingLeft="10dp" 
       android:paddingRight="10dp" android:paddingTop="10dp" 
       android:paddingBottom="10dp" android:textSize="19sp" 
       android:onClick="Something" /> 
      <Button android:layout_width="wrap_content" android:id="@+id/button1" 
       android:layout_height="wrap_content" android:paddingLeft="10dp" 
       android:textColor="@color/White" android:text="Something" 
       android:background="@drawable/tabs" android:paddingBottom="10dp" 
       android:textSize="19sp" android:paddingRight="10dp" 
       android:paddingTop="10dp" 
       android:onClick="Something"></Button> 
      <Button android:layout_width="wrap_content" android:id="@+id/button2" 
       android:layout_height="wrap_content" android:paddingLeft="10dp" 
       android:textColor="@color/White" android:text="Something" 
       android:background="@drawable/tabs" android:paddingBottom="10dp" 
       android:textSize="19sp" android:paddingRight="10dp" 
       android:paddingTop="10dp" 
       android:onClick="Something"></Button> 

      <Button android:text="Something" android:layout_height="wrap_content" 
       android:layout_width="wrap_content" android:background="@drawable/tabs" 
       android:textColor="@color/White" android:paddingLeft="10dp" 
       android:paddingRight="10dp" android:paddingTop="10dp" 
       android:paddingBottom="10dp" android:textSize="19sp" 
       android:onClick="Something"/> 

     </LinearLayout> 

    </HorizontalScrollView> 

    <FrameLayout android:id="@+id/activity_phone_tabbedviewer_fragment_container" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:layout_below="@id/activity_phone_tabbedview_scroll"> 
    </FrameLayout> 

</RelativeLayout> 

我用來實際插入片段的代碼如下。

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
NewsList newsList = new NewsList(); 
fragmentTransaction.add(R.id.activity_phone_tabbedviewer_fragment_container, newsList); 
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
fragmentTransaction.commit(); 

有沒有人知道什麼是錯的?

回答

134

您能否在NewsListFragment中發佈您的onCreateView(...)方法的內容?

我猜你是在某個時候調用LayoutInflater.inflate(...)。如果是這樣你需要使用overloaded version並通過attachToRootfalseView將被添加到在Fragment.replace(...)通話的層次結構,所以在充氣過程中不應該連接。

+0

感謝尼克,這個建議工作完美。添加false以便使用重載版本。 – Tom 2011-05-17 21:13:21

+0

這對我來說伎倆! – 2012-09-27 14:46:29

+0

該死的。我浪費了很多時間來解決這個問題,這是一個'錯誤'的問題。謝謝! – 2012-09-30 09:33:54

11

非常感謝!爲了使它更瑣碎,這裏是如何工作對我來說:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Call the specific overload of inflate 
    return inflater.inflate(R.layout.frag_layout, null, false); 
} 
+1

即使我這樣使用也會出錯查看視圖= inflater.inflate(R.layout.fragment_chats,null,false); – 2013-03-04 05:12:57

相關問題