Android常用ViewGroup之LinearLayout

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/txksnail/article/details/83117955

简介

线性布局在开发中使用很多,可以用来做垂直方向或水平方向的view布局。

重要属性

- android:orientation 
控制view布局的方向,是必需属性。取值vertical或者horizontal,默认值是horizontal。

- android:gravity
控制内部子View对齐方式,常用取值center、center_vertical、center_horizontal、top
、bottom、left、right等,这个不是线性布局的特有属性,这个是View的通用属性。可以同时取多个使用"|"进行或运算
比如:android:gravity="center_vertical|left" 垂直居中并对齐左边
  • 子View中使用的属性
- android:layout_weight
权重,线性布局子view的特有属性。用来分配线性布局的剩余空间的。使用权重一般要把分配该权重方向的长度设置为零,比如在水平方向分配权重,就把width设置为零。
使用这个属性可以轻松实现例如水平方向两个按钮各占1/2空间的效果,而没有适配问题。

- android:layout_gravity
设置子view在父容器中的显示位置。常用属性值有center、center_vertical、center_horizontal、top、bottom、left、right等
注意center的取值效果,这里并不是表示显示在LinearLayout的中心,当LinearLayout线性方向为垂直方向时,center表示水平居中,但是并不能垂直居中,此时等同于center_horizontal的作用;同样当线性方向为水平方向时,center表示垂直居中,等同于center_vertical

示例

1、线性布局使用 android:gravity=“center”

<?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:gravity="center"//取值center的效果
    android:orientation="horizontal">

    <TextView
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:gravity="center"
        android:background="#aaaaaa"
        android:text="HelloWorld" />

</LinearLayout>

居中效果.jpg

2、子view使用 android:layout_gravity=“center”

<?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="horizontal">

    <TextView
        android:layout_gravity="center" //线性布局水平方向时效果实际是垂直居中等同于设置center_vertical
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:background="#aaaaaa"
        android:text="HelloWorld" />

</LinearLayout>

垂直居中.jpg

3、使用layout_weight实现的效果
两边两个TextView宽度一定,中间的空间让另一个TextView占满

<?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="horizontal">

    <TextView
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:background="#aaaaaa"
        android:gravity="center"
        android:text="HelloWorld" />
    <TextView
        android:background="#FF0000"
        android:layout_weight="1"//使用权重
        android:gravity="center"
        android:text="HelloWorld"
        android:layout_width="0dp"
        android:layout_height="40dp" />

    <TextView
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:background="#aaaaaa"
        android:gravity="center"
        android:text="HelloWorld" />

</LinearLayout>

权重.jpg

拓展

1、线性布局中android:gravity和android:layout_gravity为什么效果不一致?

android:gravity含义是设置当前view的内容在当前view的内部对齐方式。android:layout_gravity属性以layout_开头,只能在子View中使用,表达的含义是子view在父布局中对齐方式。从含义上来讲示例1和示例2相同,但是显示效果是不一样的。
可以这样理解当给线性布局设置android:gravity属性时,会实际产生期望的效果。当在线性布局中子view使用android:layout_gravity时,实际上是对子view所在的水平区域或者垂直区域做对齐处理。

比如线性布局是水平方向,我们设置其填满父布局,xml示例

<?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="horizontal">

    <TextView
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:background="#aaaaaa"
        android:layout_gravity="center"
        android:text="HelloWorld" />
</LinearLayout>

由于线性布局不能自动换行,会一直往水平方向添加view,所以会产生垂直方向的区域,如下图,此时layout_gravity的效果实际是在这个区域里面进行对齐处理
区域.jpg

2、线性布局子View使用layout_weight(权重)的含义

线性布局中每个子view都可以预先设置自己的宽高数据。以示例3讲解,
我先设置左右两边两个TextView的固定的宽高值,中间的宽度设置为0,此时水平方向的剩余空间,线性布局就会根据子view的权重比值来分配,由于我只给中间的view的设置了权重,所以这个权重值无论是什么剩余空间都会全部分配给它。

那如果我希望左右两边的view和中间的view共享剩余的空间,看下面的效果

<?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="horizontal">

    <TextView
        android:layout_weight="1"//使用权重
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:background="#aaaaaa"
        android:gravity="center"
        android:text="HelloWorld" />
    <TextView
        android:background="#FF0000"
        android:layout_weight="1"//使用权重
        android:gravity="center"
        android:text="HelloWorld"
        android:layout_width="0dp"
        android:layout_height="40dp" />

    <TextView
        android:layout_weight="1"//使用权重
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:background="#aaaaaa"
        android:gravity="center"
        android:text="HelloWorld" />

</LinearLayout>

权重分配效果.jpg
中间红色的TextView变小了,左右两边变大了。
权重属性值生效是在子view已经分配完空间之后,对剩余空间的按照权重的比值进行处理,上面三个view的权重比是1:1:1,所以每个分剩余空间的1/3。

猜你喜欢

转载自blog.csdn.net/txksnail/article/details/83117955