Android Fragments在手机上工作,但不是平板电脑

时间:2012-02-27 21:20:46

标签: android-fragments android android-tabs

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

在平板电脑上,我的游戏活动布局只是将屏幕分成4个相等的象限,分别是FragmentA,FragmentB,FragmentC和FragmentD。这似乎工作得很好,他们都显示得很好。但是,在平板电脑用户界面上,如果我点击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()方法时没有任何明显的事情发生。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

修改

可能是您平板电脑的gameactivity.xml不再包含进一步查看儿童视图的空间。即,您有一个包含两个孩子LinearLayout的顶级LinearLayout。我猜这些孩子LinearLayout已经配置了layout_heightlayout_width,以确保他们填充父母。如果您随后将另一个视图添加到父LinearLayout,则可能没有剩余的空间用于呈现。

如果您将父LinearLayout包裹在FrameLayout中并将@+id/viewRoot的ID设为新片段可覆盖现有片段,该怎么办?