标题有点挑衅,但是我发现一些我无法解释的行为。
我有三组视图,每组都有一个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>