0

我的活动有 2 种不同的纵向和横向 xml 布局。我试图在方向改变时使用相同的片段,在 Activity 的 onCreate() 中使用该代码:

if (savedInstanceState == null) {
    frag = Fragment
        .instantiate(this, PlayerControlsFragment.class.getName());
} else {
    frag = fragmentManager.findFragmentByTag(FRAG_TAG);
}

然后,取决于方向:

private void initLandscapePlayerFragment(FragmentTransaction ft) {
    ft.add(R.id.layout_center_top, frag);
}
private void initPortraitPlayerFragment(FragmentTransaction ft) {
    ft.add(R.id.layout_left_top, frag);
}

它给了我一个很好的

IllegalStateException:无法更改片段 Frag 的容器 ID

事实上,当我在两个 xml 中使用相同的容器 id 时,它可以工作,但在我的情况下它不是一个解决方案。我尝试了不同的随机解决方案(在破坏活动之前分离等)但没有成功。
知道吗?

4

3 回答 3

0

供其他人阅读。请理解我们正在尝试做的事情。我们不是简单地处理屏幕旋转。我们试图在屏幕旋转和布局更改后重新附加片段。

Android 会抛出一个错误,即未将片段附加回具有相同 ID 的容器。问题是随着布局的改变,容器不存在,我们特别想附加到一个新的容器(因为它是一个不同的布局,即具有多个面板的景观)。

我可能和你一样沮丧。我发现您的答案没有解决方案,据我所知这是不可能的。根本不可能在 UI 片段上设置 RetainInstance(true) 并在屏幕旋转后重新附加。至少不使用支持库(本机支持可能有效,我不知道/不相关)。

最后,我只是允许碎片被转储并从头开始重新创建。

这可能很麻烦,因为后台仍然存在..

我不得不打电话

super.onCreate(null)

转储片段事务回栈。

然后使用来自 onSaveStateInsance 的包中我自己的信息重新创建屏幕,以符合用户对布局更改的期望(两个片段中的哪一个现在将占据整个屏幕)。

该行为是高度特定于应用程序的......所以我很高兴详细说明或讨论它如何适用于您,但基本上重申,我不得不抛弃所有内容并根据用户期望从头开始重新创建,没有任何东西来自android。事实上,android 使用了一个只会崩溃的 backstack,并且无法杀死 backstack,而是将 null 传递给 super.oncreate 调用。

于 2013-05-29T11:37:28.283 回答
0

我也必须解决这个问题。就我而言,我第一次将片段添加到容器中时使用“添加”方法,然后“分离”以删除片段。从理论上讲,“deattach”的优势在于,当您稍后使用“attach”时,片段会自动转到前一个容器。

这种方法可以正常工作,直到用户旋转设备并更改容器,在这种情况下,如果容器不存在于屏幕上,您将看到黑屏。

在调用附加方法之前有可能更改容器会很棒,但显然这是不可能的......在其他线程中,我有一些想法,比如在使用新容器将片段添加到屏幕之前复制片段

Android Fragment - 从一个视图移动到另一个视图?

还有其他想法吗?

于 2013-06-04T09:00:47.173 回答
-2

通过阅读有关支持多个屏幕的设计文档(#Using 配置限定符),您不应该根据您的设备方向控制使用哪种布局来膨胀视图。正确的做法是将视图的横向版本添加到 \*-land 资源文件夹。通过将选择哪个资源的控制权交给 Android 并删除您拥有的那些私有 init 方法来简化您的代码。你还有同样的问题吗?

于 2012-05-28T15:41:20.760 回答