【问题标题】:Android Fragments working on phone, but not tabletAndroid Fragments 适用于手机,但不适用于平板电脑
【发布时间】:2012-02-27 21:20:45
【问题描述】:

我正在开发一个 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() 方法时没有任何明显的变化。

有什么想法吗?

【问题讨论】:

    标签: android-fragments android android-tabs


    【解决方案1】:

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

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

    编辑:

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

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

    【讨论】:

    • 这也是我的第一个想法,但平板电脑布局和手机布局中有两个@+id/viewRoot 元素。我尝试更改 id 只是为了确定,但没有任何效果。
    • 我需要做更多的试验,但 FrameLayout 似乎正在走向解决方案。我的 FragmentC 确实出现了,尽管由于屏幕上的多个位置被标识为 viewRoot,它出现在错误的位置......这是需要更多工作的部分。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多