【问题标题】:How to replace deprecated TabActivity without nesting Fragments into Fragments?如何在不将片段嵌套到片段中的情况下替换已弃用的 TabActivity?
【发布时间】:2012-01-25 23:09:29
【问题描述】:

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

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

所以我的主要活动是一个 FragmentActivity,它有一个“内容”框架布局和一个“停靠”片段。因此,framelayout 会使用 viewpager 进行膨胀。

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

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

除了 TabActivity 已弃用,建议我使用... Fragments!

这里可以做什么?

编辑:让我粘贴堆栈跟踪

01-26 00:03:41.167 E/AndroidRuntime(32723): java.lang.IllegalStateException: 指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.view.ViewGroup.addViewInner(ViewGroup.java:3344)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.view.ViewGroup.addView(ViewGroup.java:3215)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.view.ViewGroup.addView(ViewGroup.java:3172)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.view.ViewGroup.addView(ViewGroup.java:3152)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:874)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.os.Handler.handleCallback(Handler.java:605)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.os.Handler.dispatchMessage(Handler.java:92)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.os.Looper.loop(Looper.java:137)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 android.app.ActivityThread.main(ActivityThread.java:4340)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 java.lang.reflect.Method.invokeNative(Native Method)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 java.lang.reflect.Method.invoke(Method.java:511)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-26 00:03:41.167 E/AndroidRuntime(32723): 在 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()s 与 new SurvivalFragment()R.id.main_contents 的新事务时发生崩溃

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

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

    【讨论】:

    • 是的,我知道但忘了在这里提及。感谢您的意见。
    【解决方案2】:

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

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

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

    【讨论】:

    • 那么嵌套 Fragments 好吗?我没有看到任何 Android 文档说它不是,但关于 stackoverflow 的共识是它会导致问题。我正在将选项卡(必须定义为片段)添加到操作栏。每个选项卡都有多个视图,可以很好地定义为片段,但容器也是片段。如果 Fragments 不能嵌套,那么它的用处就会受到严重限制。
    • 不行。我的应用程序布局是一场噩梦!为了避免嵌套片段,我不得不使用已弃用的 TabActivity。我有一个主屏幕,在停靠栏中有 4 个按钮(实际上是选项卡活动的选项卡小部件),在第一个选项卡的内容中,我有一个使用片段的 ViewPager。我真的不喜欢 Fragments 编程架构,要么因为我没有完全理解它,要么因为它很烂。无论哪种方式,都不要嵌套 Fragments(你可以,但它会在每次事务中崩溃)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多