捕捉元素/条件布局

时间:2010-04-14 12:11:52

标签: android android-layout

对于非常糟糕的标题,我不知道该怎么称呼这个问题。我想要做的是:有RelativeLayout有两个孩子:

  1. 一个layout_centerInParent="true"
  2. 一个layout_alignParentBottom="true"
  3. 但是,当设备处于横向模式时,元素(1)在元素(2)下稍微 。但是,元素(1)在其上方有足够的空间出现高于元素(2)。我如何制作布局,以便如果屏幕太小而不能使元素(1)居中并使两个元素重叠,那么将元素(1)对齐(如在layout_above)元素(2)?

3 个答案:

答案 0 :(得分:2)

这应该可以为您提供一个布局,text1项填充text2上方的可用空间,并在该空间中垂直和水平居中;并且text2位于底部,水平居中。

<LinearLayout 
    android:orientation="vertical"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent">

    <TextView
        android:id="@android:id/text1" 
        android:layout_width="fill_parent" 
        android:layout_height="0dp" 
        android:layout_weight="1" 
        android:text="Centered" 
        android:gravity="center_vertical|center_horizontal"
        />

    <TextView
        android:id="@android:id/text2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Bottom"
        android:gravity="center_horizontal"
        />
</LinearLayout>

重要部分为android:layout_weight,并与android:gravity结合。

答案 1 :(得分:1)

如果您的元素(1)资源不是太多,那么这里的左侧建议可能会有效。

有两个版本的元素(1),第一个带有layout_centerInParent="true",第二个带有layout_above="@id\element2"。将它们默认为android:visibility="invisible"。在onCreate Post a Runnable中检查两个元素的Y维度,并在具有最小值的元素上设置View.VISIBLE

答案 2 :(得分:1)

新想法:

这是另一种想法,它的解决方法不是很优雅,但它非常简单。将元素(1)放在它自己的&lt; LinearLayout&gt;配置如下:

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="fill_parent" // More on this line below
    android:layout_alignParentTop="true"
    android:layout_above="@id/element2"
    android:gravity="center">

线性布局将始终从屏幕顶部跨越到元素(2)的上方,并且由于其重力是“中心”,因此元素(1)将始终位于可用空间的中间。注意:行android:layout_height="..."是必需的,但似乎没有做任何事情。无论是fill_parent还是wrap_content,其高度都被将其顶部锚定到ParentTop并将其底部锚定到element(2)的行覆盖。但是,没有该行会使其因运行时异常而崩溃。


原创,不太好主意:

另一种不太理想的解决方案是使用两个布局文件。将纵向布局xml放在布局文件夹中,将横向布局放在名为layout-land的新文件夹中。 Android然后根据手机的方向自动选择正确的一个。我认为您可以使用layout-port,但将纵向放在layout中可确保它知道默认使用哪一个。