2012-02-27 75 views
0

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

在平板电脑上,我的游戏活动布局将屏幕分割为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中点击,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

难道你在你的层次结构中有两个LinearLayoutsid@+id/viewRoot(一个在gameactivity.xml中,一个在Fragment C的xml中)?

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

编辑:

这可能是平板电脑的gameactivity.xml只包含进一步的子视图没有更多的空间。即您拥有含有两个子女LinearLayout的顶级LinearLayout。我猜这些孩子LinearLayout已经配置了layout_heightlayout_width,以确保他们填写父母。如果您然后将其他视图添加到父项LinearLayout,则可能没有剩余的空间用于渲染。

如果您将父项LinearLayout包装在FrameLayout中,并给出@+id/viewRoot的ID,以确定新片段可以覆盖现有片段?

+0

这是我的第一个想法,但平板电脑布局中还有两个'@ + id/viewRoot'元素以及电话布局。我试图改变ID来确保,但没有任何效果。 – 2012-02-27 21:52:21

+0

更新 - 希望有所帮助。 – tomtheguvnor 2012-02-27 21:59:36

+0

我需要做更多的尝试,但FrameLayout似乎正在朝着解决方案前进。我的FragmentC确实出现了,尽管因为屏幕上的多个地方被视为viewRoot,它显示在错误的地方......这是需要更多工作的部分。谢谢! – 2012-02-27 22:18:38

相关问题