Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 根据方向,在不同容器中显示片段_Android_Fragment_Illegalstateexception - Fatal编程技术网

Android 根据方向,在不同容器中显示片段

Android 根据方向,在不同容器中显示片段,android,fragment,illegalstateexception,Android,Fragment,Illegalstateexception,我的活动有两种不同的纵向和横向xml布局。我试图在方向改变时使用相同的片段,该代码位于Activity的onCreate()中: 然后,根据方向: private void initLandscapePlayerFragment(FragmentTransaction ft) { ft.add(R.id.layout_center_top, frag); } private void initPortraitPlayerFragment(FragmentTransaction ft) {

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

然后,根据方向:

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:无法更改碎片碎片的容器ID

事实上,当我在两个xml中使用相同的容器id时,它是有效的,但在我的例子中它不是一个解决方案。 我尝试过不同的随机解决方案(在销毁活动之前分离等),但没有成功。

有什么想法吗?

通过阅读上的设计文档,您不应该根据设备方向来控制用于充气视图的布局。正确的方法是将视图的横向版本添加到\*-land resource文件夹中。通过将所选资源的控制权移交给Android并删除您拥有的私有init方法,简化代码。你还有同样的问题吗?

对于其他阅读者。请理解我们正在尝试做什么。我们不是简单地处理屏幕旋转我们正在尝试在屏幕旋转和布局更改后重新附着片段。

Android抛出了一个错误,即没有将片段附加回具有相同ID的容器。问题是,如果布局更改,容器不存在,我们特别希望附加到一个新容器(因为它是一个不同的布局,即具有多个面板的景观)

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

最后,我只允许转储片段并从头开始重新创建

这可能是一件麻烦事,因为后盾还在那里

我不得不打电话

super.onCreate(null)
反向转储片段事务

然后使用OnSaveStateInance捆绑包中我自己的信息根据用户对布局更改的期望(两个片段中的哪一个现在会占据整个屏幕)重新创建屏幕


该行为是高度特定于应用程序的。。。因此,我很高兴能够解释或讨论它是如何应用于您的,但我必须重申,我必须抛弃一切,按照用户的期望从头开始重新创建,android不会自动生成任何东西。事实上,android使用了一个只会崩溃的backbackback,无法杀死backbackback,只能将null传递给super.oncreate调用。

我也必须解决这个问题。在我的例子中,我在第一次将片段添加到容器时使用“add”方法,并使用“deattach”删除片段。理论上,“deattach”的优点是,当您稍后使用“attach”时,片段会自动转到上一个容器

在用户旋转设备并更换容器之前,这种方法可以正常工作,在这种情况下,如果容器不在屏幕上,您将得到一个黑屏

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


还有其他想法吗?

为什么容器需要不同的ID?好吧,我的布局结构完全不同,无论是纵向还是横向…由于纵向模式对我的所有片段只使用一个容器(通过actionbar导航选项卡切换),我无法在两种模式下使用相同的容器ID(在3个容器中横向显示所有3个片段)我明白了。那么,也许可以做一些类似于规范Shakespare片段示例的事情,在这些情况下使用单独的活动,就像他们在小屏幕上使用一个活动,在平板电脑上使用另一个活动,并控制一个主活动。实际上,他们似乎没有使用不同的活动,而且肯定没有两种不同的导航模式。是的,我有ne main.xml在/res/layout中,另一个在/res/layout land中(我将在/res/layout xlarge land中有一个),但它们是完全不同的:1-肖像一个只包含一个容器,3个片段使用actionbar导航选项卡进行切换。2景观一个包含3个容器,每个片段一个。对特定场景有什么建议吗?我明白你的意思了……我也接受了这一思路我不需要实现它,因为我对标签的需求是从屏幕的不动产中产生的,因此较小的屏幕设备有标签,而较大的屏幕没有,没有像您的情况那样进行混合和匹配。您为什么要在代码中添加片段?您是否可以用XML声明它,从而放弃什么责任是根容器id吗?我对您看到的错误消息的理解是FragManager不满意您正在更改它唯一可以识别碎片的东西。嗯,我猜fragmentManager也可以通过标记来识别它们…即使我在活动被破坏之前分离碎片,它也不满意!我最初添加了碎片因为它首先看起来更灵活,因为我也有一个没有布局的片段,因为添加的代码/修复的代码混合会产生问题,而且因为actionbar导航选项卡的使用似乎就是为了这种方式设计的……我可能会考虑使用这些选项卡来隐藏/显示片段布局,如果没有其他解决方案…非常令人失望!他的问题并不意味着他做得不对。问题是保留的碎片无法重新连接到新布局。我认为这不值得否决。除非
super.onCreate(null)