1

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

  1. 一个与layout_centerInParent="true"
  2. 一个与layout_alignParentBottom="true"

但是,当设备处于横向模式时,元素 (1) 会出现在元素 (2)的上方下方。但是,元素 (1) 上方有足够的空间出现元素 (2) 上方。我该如何进行布局,以便如果屏幕太小而无法居中元素 (1) 并且使两个元素重叠,那么将元素 (1) 对齐在元素 (2)上方(如layout_above)?

4

3 回答 3

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

于 2010-04-14T22:27:40.487 回答
1

好吧,如果您的元素 (1) 不是太耗费资源,那么这里有一个 leftfield 建议可能会起作用。

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

于 2010-04-14T12:25:42.323 回答
1

新思路:

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

<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确保它知道默认使用哪一个。

于 2010-04-14T12:49:50.050 回答