2011-05-06 41 views
44

我需要与另一Fragment更换在一个ActivityFragment替换一个片段,下面是Activity的层文件:机器人:不能与其他

<?xml version="1.0" encoding="utf-8"?> 

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/home_layout_container"> 

    <fragment android:name="com.foo.FragA" 
     android:id="@+id/home_list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    </FrameLayout> 

所以默认有弗拉加 ,现在我想用取代它FragB在活动中,我所做的:

public void onRegionClicked(Region region) { 
    RegionInfoFragment rif = RegionInfoFragment.newInstance(region); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.home_list, rif); 
} 

但我得到异常:

>6:24:40.685: ERROR/AndroidRuntime(9194): Uncaught handler: thread main exiting due to uncaught exception 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.view.ViewGroup.addViewInner(ViewGroup.java:1857) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.view.ViewGroup.addView(ViewGroup.java:1752) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.view.ViewGroup.addView(ViewGroup.java:1709) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.view.ViewGroup.addView(ViewGroup.java:1689) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:743) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:933) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:578) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1219) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:380) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.os.Handler.handleCallback(Handler.java:587) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.os.Looper.loop(Looper.java:123) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
05-06 16:24:40.692: ERROR/AndroidRuntime(9194):  at dalvik.system.NativeStart.main(Native Method) 

我该怎么办?

谢谢!

+0

抱歉,我犯了一个错误,我没有错过ft.commit ()在代码中,并得到了上述例外。 – hzxu 2011-05-06 06:37:19

+0

这个视频显示了它的完成方式:[link](https://www.youtube.com/watch?v=KUNsFhcZNAo) – user3800924 2015-12-04 13:36:13

回答

112

您无法替换布局文件中静态定义的片段。您只能通过FragmentTransaction替换您动态添加的片段。

+0

谢谢,我会尝试以编程方式添加它们。 – hzxu 2011-05-06 07:37:14

+0

任何人都可以提供一个链接显示正确的方法来做到这一点?谢谢。 – James 2011-10-07 04:12:16

+6

@James - 看看[Fragment Android Documentation](http://developer.android.com/guide/topics/fundamentals/fragments.html)。查看下面的代码片段,**“或者,以编程方式将片段添加到现有的ViewGroup。”** – 2011-11-03 15:31:53

4

尝试以commit()结尾的英尺,您需要将commit()更改为让其知道。

0

替换另一个片段,并在后面的堆栈保留以前的状态:

//创建新的片段和交易

Fragment newFragment = new ExampleFragment(); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

// Replace whatever is in the fragment_container view with this fragment, 
// and add the transaction to the back stack 
transaction.replace(R.id.fragment_container, newFragment); 
transaction.addToBackStack(null); 

// Commit the transaction 
transaction.commit();