在RelativeLayout中设置minHeight,禁用alignBaseline?

时间:2014-08-19 14:46:46

标签: android android-layout relativelayout

我的RelativeLayout看起来应该更像这样:

+----------------------------------------------+
|                                              |
|                                              |
|+----------------+          +----------------+|
||                |+--------+|                ||
||     View 1     || View 2 ||     View 3     ||
|+----------------++--------++----------------+|
|                                              |
|                                              |
+----------------------------------------------+

当我的相对布局具有固定高度(例如80dp)时,我完美地实现了它。不幸的是,我需要android:layout_height="wrap_content"设置android:minHeight(例如80 dp)。当我以这种方式更改布局时,android:layout_alignBaseline似乎不适用于View2,我得到类似的内容:

+----------------------------------------------+
|                                              |
|                  +--------+                  |
|+----------------+| View 2 |+----------------+|
||                |+--------+|                ||
||     View 1     |          |     View 3     ||
|+----------------+          +----------------+|
|                                              |
|                                              |
+----------------------------------------------+

我的xml看起来像这样:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="80dp" >

    <TextView
        android:id="@+id/View1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/View2"
        android:gravity="center"
        android:text="View1" />

    <TextView
        android:id="@+id/View2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/View1"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:text="View2" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/View2"
        android:gravity="center"
        android:text="View3" />

</RelativeLayout>

任何人都知道为什么它不起作用?

3 个答案:

答案 0 :(得分:2)

经过几次测试后,我得出的结论是,wrap_contentRelativeLayout的高度设置只是错误的。它不能与不填充布局整个高度的视图正确配合。对于此类观点,RelativeLayout存在垂直居中问题(规则CENTER_VERTICALCENTER IN PARENT)。基本上,应该垂直居中的视图将显示,就像它们一样,但布局本身将&#34; SEE &#34;它们(为了设置其他规则)是对齐的顶部。

因此,将任何规则设置为依赖于那些&#34;错误地通过布局感知的位置&#34;视图,将导致以非预期方式显示的视图。

如果你考虑到这一点,我的案子很容易解释。这就是视图的显示方式:

+----------------------------------------------+
|                                              |
|                  +--------+                  |
|+----------------+| View 2 |+----------------+|
||                |+--------+|                ||
||     View 1     |          |     View 3     ||
|+----------------+          +----------------+|
|                                              |
|                                              |
+----------------------------------------------+

这就是RelativeLayout&#34;感知&#34;它们:

+----------------------------------------------+
|+----------------+          +----------------+|
||                |+--------+|                ||
||     View 1     || View 2 ||     View 3     ||
|+----------------++--------++----------------+|
|                                              |
|                                              |
|                                              |
|                                              |
+----------------------------------------------+

两张照片中的View 2位置相同 )。

由于我需要将我的布局设为RelativeLayout,为了解决这个问题,我决定完全放弃使用wrap_content值,并自己控制视图的高度。它使我的布局有点复杂,但只要我控制它,它就好了。

答案 1 :(得分:0)

这取决于文本填充视图和边距的方式。

但看起来你想要“alignBottom”而不是“alignBaseline”

What is the baseline in RelativeLayout?

但是,我还注意到您的布局呈现顺序可能会影响以您希望的方式匹配内容库的能力。 View1引用View2和View2引用View1。这会编译但会产生不需要的结果,就像您所描述的那样。

根据你到目前为止所描述的内容,你应该使用水平的LinearLayout而不是RelativeLayout。

答案 2 :(得分:0)

应该可以。

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:minHeight="80dp">

    <TextView
        android:id="@+id/View1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/View2"
        android:gravity="center"
        android:text="View1" />

    <TextView
        android:id="@+id/View2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:text="View2" />

    <TextView
        android:id="@+id/view3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@+id/View2"
        android:gravity="center"
        android:text="View3" />

</RelativeLayout>