不同方向的屏幕需要使用不同的碎片(fragments)

9

我有一个平板应用程序中的Activity,我想根据屏幕方向显示不同的Fragments。我认为最简单的方法就是定义两个不同的布局XML文件,一个是横屏的,一个是竖屏的。换句话说,我有一个/layout/home.xml文件,它看起来像这样:

<LinearLayout android:orientation="horizontal">
  <fragment class="com.foo.app.Frag1" android:id="frag1"/>
  <fragment class="com.foo.app.Frag2" android:id="frag2"/>
</LinearLayout>

然后在/layout-port/home.xml中:

<LinearLayout android:orientation="vertical">
  <fragment class="com.foo.app.Frag2" android:id="frag2"/>
  <fragment class="com.foo.app.Frag3" android:id="frag3"/>
</LinearLayout>

当我运行它时,可以从横屏切换到竖屏,并且一切正常。但是,当我从竖屏切换到横屏时,应用程序会崩溃,并显示一个带有资源ID等于“frag3”的android.content.res.Resources$NotFoundException。没错,它在切换到横屏模式时寻找Frag3,而该模式中没有Frag3。这发生在Activity.onCreate堆栈期间,因此在我的任何代码有机会使应用程序崩溃之前就发生了。
Fragment不能按照这种方式工作吗?我需要使用FragmentTransaction吗?

这只是一个猜测,但可能是FragmentManager通过savedInstanceState捆绑在onPause/onCreate中保存/恢复片段。尝试显式地将null传递给super.onCreate(),看看是否可以解决崩溃问题。 - gngr44
尝试在你的片段中调用 setRetainInstance(false); - Al.
你能提供一份堆栈跟踪吗? - Alexander Lucas
1个回答

1

没有看到代码很难说——不过,Resources.NotFoundException通常意味着您尝试错误地查找资源(例如R.layout.xx、R.drawable.xx等)。

话虽如此,我尝试使用您的布局XML编写了一个小应用程序,当我复制您的XML代码进行测试时,编译器因为将字符串硬编码为ID而向我发出警告。尝试将android:id属性的值切换为以下内容:

android:id="android:id="@+id/frag1"

这可能会解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接