我正在尝试实现类似这样的功能:
目前,我手动将瓷砖的宽度设置为屏幕宽度的一半。 这很有效,但在瓷砖之间添加分隔符(如屏幕截图中所示)很困难。 幸运的是,在API 21中,GridLayout现在支持权重,这里为您方便引用:
从API 21开始,GridLayout对多余空间的分配采用了权重原则。如果没有指定权重,则尊重以前的约定,即如果视图在其组内指定了某种对齐方式,则列和行将被视为可变。因此,视图的灵活性受其对齐方式的影响,而通常是通过设置子布局参数的gravity属性来定义的。如果给定轴线上定义了权重或对齐方式,则将该组件视为在该方向上具有灵活性。如果没有设置权重或对齐方式,则该组件被认为是不灵活的。 同一行或列组中的多个组件被认为是并行的。只有当组内所有组件都是灵活的时,这样的组才是灵活的。相邻的行和列组被视为串联。由这两个元素组成的复合组件在其中一个元素是灵活的情况下也是灵活的。 要使列拉伸,请确保其内部的所有组件都定义了权重或gravity。要防止列拉伸,请确保列中的一个组件没有定义权重或gravity。 当灵活性原则无法提供完全消除歧义时,GridLayout算法偏爱靠近右侧和底部边缘的行和列。更准确地说,GridLayout将其每个布局参数视为沿给定轴线定义网格线的变量集中的约束。在布局期间,GridLayout解决约束,以便返回这些约束的唯一解,其中所有变量都小于或等于任何其他有效解中相应的值。我设计了一个简单的布局,包含两列网格布局。试图实现两个等宽的列:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<GridLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:columnCount="2">
<TextView android:layout_width="wrap_content" android:layout_gravity="fill_horizontal" android:text="Hello" android:layout_columnWeight="1" />
<TextView android:layout_width="wrap_content" android:layout_gravity="fill_horizontal" android:text="Hello" android:layout_columnWeight="1" />
<TextView android:layout_width="wrap_content" android:layout_gravity="fill_horizontal" android:text="Hello" android:layout_columnWeight="1" />
<TextView android:layout_width="wrap_content" android:layout_gravity="fill_horizontal" android:text="Hello" android:layout_columnWeight="1" />
<TextView android:layout_width="wrap_content" android:layout_gravity="fill_horizontal" android:text="Hello" android:layout_columnWeight="1" />
</GridLayout>
</RelativeLayout>
我认为因为所有的子元素具有相等的列宽比重,所以会导致等宽的列。然而实际情况并非如此,因为以下结果是这样的:
另一个问题是,我似乎无法使用权重技巧来确保相等的宽度,而不考虑内容(TextView会消失)。我如何在GridLayout中实现这一点?
android:layout_gravity="Left|Top|fill"
或android:layout_gravity="Right|Top|fill"
来实现。也许这样会起作用。但老实说,我不认为这就是网格布局的工作方式。最后,你总是可以通过findviewById
找到你的视图,因为它是一个视图组,单元格是用于对齐的。希望能有所帮助。@untitled - Elltz