我正在开发一款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()方法时没有任何明显的事情发生。
有什么想法吗?
答案 0 :(得分:1)
您的层次结构中是否有两个LinearLayouts
id
@+id/viewRoot
(一个在gameactivity.xml中,一个在Fragment C的xml中)?
我认为可能是因为某种原因尝试将Fragment附加到层次结构中的错误点,但我不能说为什么这只会是一个屏幕布局的问题。
修改强>
可能是您平板电脑的gameactivity.xml不再包含进一步查看儿童视图的空间。即,您有一个包含两个孩子LinearLayout
的顶级LinearLayout
。我猜这些孩子LinearLayout
已经配置了layout_height
和layout_width
,以确保他们填充父母。如果您随后将另一个视图添加到父LinearLayout
,则可能没有剩余的空间用于呈现。
如果您将父LinearLayout
包裹在FrameLayout
中并将@+id/viewRoot
的ID设为新片段可覆盖现有片段,该怎么办?