标题有点挑衅,但是我发现一些我无法解释的行为。

我有三组视图,每组都有一个TextView tvX和一个Spinner spX,X = A,B,C。 textview是微调器的标题或提示,因此我希望微调器layout_toRightOf分别是TextView。由于它们相互引用,因此我还将layout_alignBaseline的Spinner设置为TextView。这可以正常工作。现在,我要堆叠三组,以使TextView的右边缘对齐(每个都有尾随的冒号,应该对齐),而Spinner的左边缘对齐。所以在堆栈中

  +----------+----------+
  |      tvA:|spA       |
  +----------+----------+
  |      tvB:|spB       |
  +----------+----------+
  |      tvC:|spC       |
  +----------+----------+


B和C视图分别获得引用A和B的属性;即layout_below和layout_alignLeft / Right。

现在碰巧tvB和tvC的文本比tvA的文本长。我会猜测RelativeLayout缩进tvA使得tvB和tvC的较长文本有空间,并且它们是右对齐的。相反,发生的是整个左列都获得了tvA文本的宽度,而tvB和tvC分别分成了两行。我尝试性地重新排列内容以使tvB成为锚点,并在tvA上进行layout_above。这导致tvA完全消失。无论如何,这不是一个适当的解决方案,因为在另一种语言中,文本的相对长度可能是相反的!如果我在tvA中添加字符以使其最长,则tvB和tvC不会再折断,但冒号仍不会对齐!实际上,看起来tvB居中于tvA之下,而tvC居中于tvC之下。

如果我将tvX左对齐,将spX右对齐,则看起来最好。但是即使在这种情况下,也会发生一些奇怪的事情:微调框不再遵守属性layout_width =“ wrap_content”,而是扩展以填充TextViews剩余的所有空间。中间的参差不齐的对齐看起来仍然很糟糕,这就是为什么我希望对齐发生在中间。

Android Studio在编辑XML时显示结果布局,并且如果光标位于View的XML定义中,它还会显示Views边缘。在那里,我可以很好地观察到属性中的布局提示如何被忽略!在实际的电话上,同样的事情也会发生。

这是XML代码:

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="@dimen/indented_margin"
        android:layout_marginBottom="5dp">

        <TextView
            android:id="@+id/device_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:text="@string/settings_sb_device" />

        <Spinner
            android:id="@+id/device"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:spinnerMode="dropdown"
            android:layout_toRightOf="@id/device_title"
            android:layout_alignBaseline="@id/device_title" />

        <TextView
            android:id="@+id/can_speed_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:layout_below="@id/device_title"
            android:layout_alignRight="@id/device_title"
            android:text="@string/settings_sb_speed" />

        <Spinner
            android:id="@+id/can_speed"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:spinnerMode="dropdown"
            android:layout_toRightOf="@id/can_speed_title"
            android:layout_alignBaseline="@id/can_speed_title"
            android:layout_alignLeft="@id/device"
            android:entries="@array/can_speeds" />

        <TextView
            android:id="@+id/baudrate_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:layout_below="@id/can_speed_title"
            android:layout_alignRight="@id/can_speed_title"
            android:text="@string/settings_sb_baudrate" />

        <Spinner
            android:id="@+id/baudrate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:spinnerMode="dropdown"
            android:layout_toRightOf="@id/baudrate_title"
            android:layout_alignBaseline="@id/baudrate_title"
            android:layout_alignLeft="@id/can_speed"
            android:entries="@array/baudrates" />
    </RelativeLayout>


我已经搜索了所涉及视图的可用属性集,但是找不到任何线索。有人可以解释这种行为吗?我忽略了什么?

最佳答案

为此使用GridLayout,columnCount为2

例如:

<android.support.v7.widget.GridLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                app:alignmentMode="alignBounds"
                app:columnCount="2"
                app:orientation="vertical"
                >


对于左侧电视+冒号,请使用RelativeLayout或什至LinearLayout都可以解决该问题。

              <LinearLayout
                    android:gravity="center"
                    android:orientation="horizontal"
                    app:layout_column="0"
                    app:layout_columnWeight="1"
                    app:layout_gravity="fill_horizontal|fill_vertical"
                    app:layout_row="0">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        tools:text="Label"
                        android:maxLines="2"
                        android:ellipsize="end"
                        android:textColor="@color/black"/>

                   <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        tools:text=":"
                        android:textColor="@color/black"/>
           </LinearLayout>

08-17 20:53