0

我正在开发一个 android 应用程序,它具有不同的手机和平板电脑布局。在手机上,我的游戏活动布局作为带有 4 个选项卡的选项卡式 UI,我们将它们称为 A、B、C 和 D。我有一个按钮选项卡栏和一个 ViewFlipper,其中包含 4 个片段。因此,当他们点击 C 选项卡时,ViewFlipper 会显示该子项,即 FragmentC。FragmentC 包含一个 ListView。当用户点击一个项目时,我想显示有关该项目的详细视图。因此,FragmentC 添加了一个带有 FragmentTransaction 的新 DetailFragment。这个新的 DetailFragment 完全覆盖了 FragmentC。如果您熟悉 iOS,我基本上是在尝试获得 UINavigationController 类型的行为。这在手机上工作得很好。

在平板电脑上,我的游戏活动布局只是将屏幕分成 4 个相等的象限,分别是 FragmentA、FragmentB、FragmentC 和 FragmentD。这似乎工作得很好,它们都显示得很好。但是,在平板电脑 UI 上,如果我在 FragmentC 的 ListView 中点击其中一项,则会执行代码以添加新片段,但屏幕上没有显示任何内容。

我的手机gameactivity.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/viewRoot" ...>
    <LinearLayout android:id="@+id/tabBarRoot" ...>
        <Button ... />
        <Button ... />
        <Button ... />
        <Button ... />
    </LinearLayout>

    <ViewFlipper android:id="@+id/viewFlipperMainMenu" ...>
        <fragment class="FragmentA" ... />
        <fragment class="FragmentB" ... />
        <fragment class="FragmentC" ... />
        <fragment class="FragmentD" ... />
    </ViewFlipper>
</RelativeLayout>

我的平板电脑gameactivity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/viewRoot" ... >
    <LinearLayout ... >
        <fragment class="FragmentB" ... />
        <fragment class="FragmentA" ... />
    </LinearLayout>

    <LinearLayout ... >
        <fragment class="FragmentC" ... />
        <fragment class="FragmentD" ... />
    </LinearLayout>

</LinearLayout>

手机和平板电脑的 FragmentC 布局 xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/viewRoot" ... >

    <ListView android:id="@+id/listView" ... />

</LinearLayout>

当 FragmentC 中的 List 项被点击时,FragmentC 会添加一个新的 DetailFragment,代码如下:

public void pushNewFragment(Fragment fragment, String description) {
    FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    transaction.add(R.id.viewRoot, fragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .addToBackStack(description).commit();
}

在电话上,这工作得很好并且 DetailFragment 出现了。在平板电脑上,调用 pushNewFragment() 方法时没有明显的变化。

有任何想法吗?

4

1 回答 1

1

会不会是您的层次结构中有两个LinearLayouts带有idof@+id/viewRoot的(一个在 gameactivity.xml 中,一个在 Fragment C 的 xml 中)?

我认为它可能出于某种原因试图将 Fragment 附加到层次结构中的错误点,尽管我不能说为什么这只会成为一个屏幕布局的问题。

编辑:

可能是您的平板电脑的 gameactivity.xml 根本没有更多空间容纳更多子视图。LinearLayout即你有一个包含两个 child的顶层LinearLayout。我猜那些孩子LinearLayout已经被配置layout_heightlayout_width确保他们填满父母。如果您随后将另一个视图添加到 parent LinearLayout,则它可能没有剩余空间可供渲染。

如果您将父级包装LinearLayout在 a 中并提供新片段可以覆盖现有片段FrameLayout的 s 的 id怎么办?@+id/viewRoot

于 2012-02-27T21:34:39.477 回答