Android Studio新手开发第六天

目录

1.网格布局GridLayout

GridLayout 容器自身的属性表

子视图的布局参数表

1.网格布局GridLayout

        虽然线性布局能在水平或者垂直方向上排列视图,却只能单行或者单列的布局方式。而相对布局虽然能够实现所行多列但是代码较为复杂不易维护,若改变了其中一个视图的位置那么其他视图排列会混乱。若想实现多行多列且易实现可以使用网格布局GridLayout。

        网格布局的排列顺序默认是从左到右、从上到下。先从左到右排列第一行再从第二行排列,以此往复直至所有视图放置完毕。那么又如何设置网格布局的行列数呢?在网格布局有两个重要属性:android:rowCount与android:columnCount。这两个属性分别设置了网格布局的行列数。

        以下方代码为例,网格布局的行列数都为2,其中包含了四个视图。它们的分别背景颜色为红、黑、绿、紫。

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:rowCount="2"
    android:columnCount="2"
    tools:context=".SecondMainActivity">

    <TextView
        android:layout_width="180dp"
        android:layout_height="60dp"
        android:gravity="center"
        android:background="@color/red"
        android:text="红色"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <TextView
        android:layout_width="180dp"
        android:layout_height="60dp"
        android:gravity="center"
        android:background="@color/black"
        android:text="黑色"
        android:textColor="@color/white"
        android:textSize="17sp" />

    <TextView
        android:layout_width="180dp"
        android:layout_height="60dp"
        android:gravity="center"
        android:background="@color/green"
        android:text="绿色"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <TextView
        android:layout_width="180dp"
        android:layout_height="60dp"
        android:gravity="center"
        android:background="@color/purple_700"
        android:text="紫色"
        android:textColor="@color/white"
        android:textSize="17sp" />

</GridLayout>

        上面代码的效果图如下:可以看到网格布局的默认填充方式是从左到右、从上到下的方式排列。那么如果想要指定某个视图在第几行第几列又该怎么做?其实网格布局还有两个重要属性android:layout_row与 android:layout_column。这两个属性其实是网格布局中的子视图的布局参数,分别对应行列的位置,例如android:layout_row="0", android:layout_column="1"则代表该子视图位于网格布局中的第一行第二列。索引是从0开始的。

        下面是代码实例。

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:rowCount="2"
    android:columnCount="2"
    tools:context=".SecondMainActivity">

    <TextView
        android:layout_width="180dp"
        android:layout_height="60dp"
        android:background="@color/red"
        android:gravity="center"
        android:layout_row="1"
        android:layout_column="1"
        android:text="红色"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <TextView
        android:layout_width="180dp"
        android:layout_height="60dp"
        android:gravity="center"
        android:layout_row="1"
        android:layout_column="0"
        android:background="@color/black"
        android:text="黑色"
        android:textColor="@color/white"
        android:textSize="17sp" />

    <TextView
        android:layout_width="180dp"
        android:layout_height="60dp"
        android:gravity="center"
        android:layout_row="0"
        android:layout_column="1"
        android:background="@color/green"
        android:text="绿色"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <TextView
        android:layout_width="180dp"
        android:layout_height="60dp"
        android:gravity="center"
        android:layout_row="0"
        android:layout_column="0"
        android:background="@color/purple_700"
        android:text="紫色"
        android:textColor="@color/white"
        android:textSize="17sp" />

</GridLayout>

        下面是上面代码的效果图。在代码中没有改变视图的顺序但是可以看出紫色与红色位置对换,绿色与黑色位置对换了。

        GridLayout网格布局的属性可以分为布局容器本身以及容器中子视图的布局参数。下面两个表格分别展示两类属性的一些重要属性。

GridLayout 容器自身的属性表

属性作用示例/说明
android:columnCount设置网格的列数android:columnCount="4" 表示网格有4列。这是最常用的属性之一,定义了网格的垂直结构。
android:rowCount设置网格的行数android:rowCount="3" 表示网格有3行。行数通常可以不设置,由系统根据子视图自动计算。
android:orientation设置网格的排列方向可选项为horizontal(水平)或vertical(垂直)。
• horizontal(默认):添加子视图时,先填满一行,再换到下一行。
• vertical:添加子视图时,先填满一列,再换到下一列。
android:useDefaultMargins是否使用默认边距设置为true时,系统会在子视图之间添加一些默认的边距,让布局看起来不那么紧凑。
android:alignmentMode设置对齐模式例如,可以设置为alignBounds来对齐子视图的边界,或者alignMargins来对齐子视图的边距。
android:rowOrderPreserved是否保留行序默认为true,表示行索引与屏幕上的Y轴顺序一致。通常不需要修改。
android:columnOrderPreserved是否保留列序默认为true,表示列索引与屏幕上的X轴顺序一致。通常不需要修改。

子视图的布局参数表

属性作用示例/说明
app:layout_column指定子视图从哪一列开始放置app:layout_column="1" 表示该视图从第1列开始(索引从0开始)。
app:layout_row指定子视图从哪一行开始放置app:layout_row="0" 表示该视图从第0行开始。
app:layout_columnSpan指定子视图横向跨越的列数app:layout_columnSpan="2" 表示该视图将占据2列的宽度。
app:layout_rowSpan指定子视图纵向跨越的行数app:layout_rowSpan="3" 表示该视图将占据3行的高度。
app:layout_gravity指定子视图在其分配的网格区域内的对齐方式这是非常重要的属性,用于控制视图的拉伸和对齐。
• fill:填充整个分配的网格区域。
• fill_horizontal:水平填充。
• fill_vertical:垂直填充。
• center:居中。
• lefttoprightbottom:靠左、上、右、下对齐。

        下面代码是代码实例,主要添加了子视图的视图跨越以及视图填充。代码中紫色添加了三个属性android:layout_rowSpan="2"、 android:layout_columnSpan="2" 、android:layout_gravity="fill",这分别代表着该视图跨越两行,跨越两列以及填充整个分配的网格区域。绿色添加了两个属性android:layout_rowSpan="3"与 android:layout_gravity="fill",这分别代表着该视图跨越三列以及填充分配的网格区域。

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="300dp"
    android:layout_height="180dp"
    android:rowCount="3"
    android:columnCount="3"
    tools:context=".SecondMainActivity">

    <TextView
        android:layout_width="100dp"
        android:layout_height="60dp"
        android:background="@color/red"
        android:gravity="center"
        android:layout_row="2"
        android:layout_column="1"
        android:layout_rowSpan="1"
        android:text="红色"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <TextView
        android:layout_width="100dp"
        android:layout_height="60dp"
        android:gravity="center"
        android:layout_row="2"
        android:layout_column="0"
        android:background="@color/black"
        android:text="黑色"
        android:textColor="@color/white"
        android:textSize="17sp" />

    <TextView
        android:layout_width="100dp"
        android:layout_height="60dp"
        android:gravity="center"
        android:layout_row="0"
        android:layout_column="2"
        android:layout_rowSpan="3"
        android:layout_gravity="fill"
        android:background="@color/green"
        android:text="绿色"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <TextView
        android:layout_width="100dp"
        android:layout_height="60dp"
        android:gravity="center"
        android:layout_row="0"
        android:layout_column="0"
        android:layout_rowSpan="2"
        android:layout_columnSpan="2"
        android:layout_gravity="fill"
        android:background="@color/purple_700"
        android:text="紫色"
        android:textColor="@color/white"
        android:textSize="17sp" />

</GridLayout>

        下面是上面代码的效果图。可以看出紫色跨越了两行两列,绿色跨越了三列,黑色与红色没有跨越。

        在使用子视图的android:layout_rowSpan与 android:layout_columnSpan这两个属性时要配合使用 android:layout_gravity来填充分配的网格区域,不然可能会达不到目的的显示效果。若将上面的代码中的紫色与绿色视图中的属性android:layout_gravity="fill"去掉则会出现下面图片所示的效果。可以看出紫色与绿色部分并没有按预期显示。因为已经设置了子视图的宽高那么在显示时默认使用已设定的宽高,这时候需要使用android:layout_gravity="fill"让GridLayout重新根据权重和跨度自动计算其实际宽度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值