Android学习笔记(六):常用布局--LinearLayout线性布局、RelativeLayout相对布局、GridLayout网格布局、ScrollView滚动视图

一、LinearLayout线性布局

        线性布局,即各个模块按照水平或者垂直方向进行排列。通过前几章的学习,大家也大致熟悉了线性布局了,下面的代码,想必大家也都能看懂。最外层的线性布局内部包含了两个线性布局。

layout_width、layout_height表示该线性布局的宽高;

match_parent、wrap_content分别表示匹配上级布局的宽高和模块中内容匹配宽高,即能够刚好完整显示内容。

orientation即表示线性布局的分布方式,vertical表示垂直排列,horizontal表示水平,如果不写该属性,默认为水平排布模式。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="horizontal one!"
            android:textSize="20sp"
            android:layout_margin="7dp"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="horizontal two!"
            android:textSize="20sp"
            android:layout_margin="7dp"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="vertical one!"
            android:textSize="20sp"
            android:layout_margin="7dp"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:text="vertical two!"
            android:textSize="20sp"
            android:layout_margin="7dp"/>
    </LinearLayout>

</LinearLayout>

        在最外层的垂直线性布局中包含了两个线性布局,一个水平排列,一个垂直排列,它们内部分别定义了两个TextView显示内容。在水平布局中,定义两个TextView的宽都为0dp,然后定义了权重layout_weight都为1,这样这两个TextView就会根据权重即1/(1+1)=1/2来分配宽度,从效果也可以看到这两个模块平分了宽。而在垂直布局中,则定义了两个TextView的高为0dp,且权重一个为1,一个为2,这样它们则会根据权重1/(1+2)和2/(1+2)来分配高度。效果图如下所示。

二、RelativeLayout相对布局 

        相对布局表示模块与模块之间的相对位置,如一个模块相对于上一级的左边对齐、右边对齐、位于中间等等;或者一个模块相对于另一个模块位于其左边对齐、右边对齐、顶部或底部等等。

         属性较多,我这里就简单列举几个,剩下的大家自己去训练。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="200dp">

    <TextView
        android:id="@+id/centerinparent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="centerinparent"
        android:layout_centerInParent="true"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="centerhorizontal"
        android:layout_centerHorizontal="true"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="centervertical"
        android:layout_centerVertical="true"/>

</RelativeLayout>

        上面的代码中,定义了一个相对布局(RelativeLayout),在布局中定义了3个TextView,分别位于上一级(即相对布局)的中心、水平中心、垂直中心。效果如下所示。因此,定义某模块相对于上一级视图的某一相对位置,就将该属性定义为true。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="200dp">

    <TextView
        android:id="@+id/centerinparent"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:text="centerinparent"
        android:layout_margin="7dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/centerinparent"
        android:text="right" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@id/centerinparent"
        android:layout_toRightOf="@id/centerinparent"
        android:text="right_top" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/centerinparent"
        android:layout_toLeftOf="@id/centerinparent"
        android:text="left_bottom" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="above_left"
        android:layout_above="@id/centerinparent"
        android:layout_alignLeft="@id/centerinparent"/>

</RelativeLayout>

        如上代码所示,展示的是模块相对于另一模块的相对位置,首先定义了一个模块(centerinparent)位于相对布局中的中心位置,而其他模块则相对于中心模块的相对位置,如位于其右侧、右侧顶部对齐、左侧底部对齐、上侧左边对齐。效果如下所示。其中,定义相对于某一模块的相对位置,就将对应的属性赋值某一模块的id,如("@id/centerinparent")。

引用某模块就采用@id/  ,增加id则采用@+id/  

三、 GridLayout网格布局

        网格布局,就如excel网格一样,定义几行几列,内容就根据网格排列。代码如下所示,定义网格布局,并设置网格行数(rowCount)和列数(rowCountcolumnCount)。记住:网格分布是从左往右,从上往下排布。

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

    <TextView
        android:layout_width="0dp"
        android:layout_columnWeight="1"
        android:layout_height="50dp"
        android:text="one_one"
        android:textSize="20dp"
        android:background="#ff0000"
        android:gravity="center"/>

    <TextView
        android:layout_width="0dp"
        android:layout_columnWeight="1"
        android:layout_height="50dp"
        android:text="one_two"
        android:textSize="20dp"
        android:background="#00ff00"
        android:gravity="center"/>

    <TextView
        android:layout_width="0dp"
        android:layout_columnWeight="1"
        android:layout_height="50dp"
        android:text="two_one"
        android:textSize="20dp"
        android:background="#f0f0f0"
        android:gravity="center"/>

    <TextView
        android:layout_width="0dp"
        android:layout_columnWeight="1"
        android:layout_height="50dp"
        android:text="two_two"
        android:textSize="20dp"
        android:background="#f0aa00"
        android:gravity="center"/>

</GridLayout>

        我们在网格分布中定义了4个TextView模块,并设置列权重,这样每行的模块就会根据权重分配宽度。此外还设置了其下级内容的对齐方式(gravity="center")。效果如下所示

        你可能会好奇,如果继续增加模块会怎样,那我们再加一个模块看看,如下所示。因此,当模块数超过所定义的数量,其会根据列数自动增加行数。

 四、ScrollView滚动视图

        当我们要显示的内容在手机显示区域内无法完全显示时,就可以考虑采用滚动视图,相信大家在使用手机时经常遇见滚动视图。代码如下所示,滚动视图分为水平滚动(HorizontalScrollView)和垂直滚动(ScrollView)。

        在使用水平滚动时,其宽度属性设置为wrap_content,这样就可以在水平方向上放入更多需要显示的东西,并通过滚动来查看内容。在水平滚动视图中添加了一个线性布局,该布局要与之对应,方向为水平排布(没写orientation属性,默认为水平)。在线性布局中增加了两个TextView,设置宽度为300dp,这样就导致两个水平分布的模块超出屏幕的范围,因此可以靠滚动视图来显示。

        而在使用垂直滚动时,其高度设置为wrap_content,这样就可以在垂直方向上放入更多需要显示的东西。注意,在其中的线性布局要设置其排布方向为vertical。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <HorizontalScrollView
        android:layout_width="wrap_content"
        android:layout_height="200dp" >
        
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent">
            
            <TextView
                android:layout_width="300dp"
                android:layout_height="match_parent"
                android:background="#ff00ff"/>

            <TextView
                android:layout_width="300dp"
                android:layout_height="match_parent"
                android:background="#ffff00" />

        </LinearLayout>
    </HorizontalScrollView>
    
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            
            <TextView
                android:layout_width="match_parent"
                android:layout_height="400dp"
                android:background="#ff0000"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="400dp"
                android:background="#0000ff"/>
        </LinearLayout>
    </ScrollView>

</LinearLayout>

 五、总结

        通过本章的学习,我们掌握了三种常用的布局和一个滚动视图:LinearLayout线性布局、RelativeLayout相对布局、GridLayout网格布局、ScrollView滚动视图。