如何在不将碎片嵌入碎片的情况下替换弃用的TabActivity?

时间:2012-01-25 23:09:30

标签: android android-fragments

我的应用很简单。我有一个主要活动,底部有一个底座,有4个图标:A,B,C,D。

当应用程序启动时,图标A处于活动状态,其内容将显示在屏幕上。 A的内容是一个包含3个屏幕的ViewPager,您可以通过水平滑动来更改这些屏幕。

所以我的主要Activity是FragmentActivity,它有一个“内容”framelayout和一个“dock”片段。因此,framelayout用viewpager充气。

问题是,我的ViewPager包含3个片段。因此,这3个片段嵌套在内容片段中。如果我尝试用另一个片段替换内容Fragment(即ViewPager)(比如用户点击了Dock中的图标B),它会崩溃,因为Android不支持嵌套片段。

我尝试将主要活动更改为TabActivity,以便将3个片段嵌套到活动而不是片段中。这很好用。

除了不推荐TabActivity之外,我建议使用......片段!

这里可以做些什么?

编辑:让我粘贴堆栈跟踪

01-26 00:03:41.167 E/AndroidRuntime(32723): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.view.ViewGroup.addViewInner(ViewGroup.java:3344)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.view.ViewGroup.addView(ViewGroup.java:3215)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.view.ViewGroup.addView(ViewGroup.java:3172)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.view.ViewGroup.addView(ViewGroup.java:3152)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:874)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.os.Handler.handleCallback(Handler.java:605)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.os.Looper.loop(Looper.java:137)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.app.ActivityThread.main(ActivityThread.java:4340)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at java.lang.reflect.Method.invokeNative(Native Method)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at java.lang.reflect.Method.invoke(Method.java:511)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at dalvik.system.NativeStart.main(Native Method)

Edit2:更多代码

在xml中我有一个FrameLayout

在我的主要活动onCreate:

    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.main_contents, new HomeFragment());
    ft.commit();

所以ViewPager没有在XML中实现,而是以编程方式添加到FrameLayout中。

当我尝试创建.replace() R.id.main_contents new SurvivalFragment()

的新交易时发生崩溃

2 个答案:

答案 0 :(得分:1)

好消息,嵌套片段现在是Jelly Bean中的supported和最新的支持包

答案 1 :(得分:0)

对不起在搜索了一下之后,我发现了这个:Error swapping / adding an XML Fragment

我只需要将inflate的最后一个参数设置为false。我的坏。

编辑:我还在寻找更好的选择。我正在使用已弃用的TabActivity。我真的想使用Fragments API,但我无法做我需要做的事情。