Android 六大布局(上)

简介: 为了让组件(TextView,Button等)在不同的手机屏幕上都能运行良好(不同手机屏幕分辨率、尺寸并不完全相同),如果让程序手动控制每个组件的大小、位置,则将给编程带来巨大的困难,为了解决这个问题,Android提供了布局管理器。布局管理器可以根据运行平台来调整组件的大小,咱们程序员要做的只是为容器选择合适的布局管理器。

布局概述



       为了让组件(TextView,Button等)在不同的手机屏幕上都能运行良好(不同手机屏幕分辨率、尺寸并不完全相同),如果让程序手动控制每个组件的大小、位置,则将给编程带来巨大的困难,为了解决这个问题,Android提供了布局管理器。布局管理器可以根据运行平台来调整组件的大小,咱们程序员要做的只是为容器选择合适的布局管理器。


       每当Acitivity.setContentView(@LayoutRes int layoutResID)方法被调用,或者一个View通过LayoutInflater对象inflater出来,那么相关的布局文件就会被加载并解析出来。XML文件中每个大写的XML节点对应着一个View对象,他们被系统实例化。在Acitviity或者Fragment的整个生命周期中,他们都是UI层级的一部分。这会影响到应用程序使用过程中的分配。

image.png


一、线性布局(LinearLayout常用)


      LinearLayout 是一个视图组,呈线性横向或纵向,依次绘制每个被添加进来的子组件。


       LinearLayout的所有子组件依次堆叠,因此无论子视图有多宽,垂直列表每行均只有一个子组件,水平列表将只有一行高(最高子组件的高度加上内边距)。LinearLayout会考虑子组件之间的边距以及每个子组件的对齐方式(右对齐、居中对齐或左对齐)。


布局权重


       LinearLayout还支持使用android:layout_weight属性为各个子组件分配权重。此属性会根据视图应在屏幕上占据的空间大小,向视图分配“重要性”值。如果拥有更大的权重值,视图便可展开,填充父视图中的任何剩余空间。子组件可指定权重值,然后系统会按照子组件所声明的权重值比例,为其分配视图组中的任何剩余空间。默认权重为零。


LinearLayout常用XML属性和相关方法说明


XML属性

相关方法

说明

android:baselineAligned

setBaselineAligned(boolean)

设置为 false 时,防止布局对齐其子项的基线。 

android:baselineAlignedChildIndex

setBaselineAlignedChildIndex(int)

当 线性 布局是另一个基线对齐的布局的一部分时,它可以指定基线对齐到其子项中的哪个子项(即,哪个子项 TextView)。 

android:divider

setDividerDrawable(Drawable)

可绘制用作按钮之间的垂直分隔线。 

android:gravity

setGravity(int)

指定对象应如何在其自身边界内在 X 轴和 Y 轴上定位其内容。 

android:measureWithLargestChild

setMeasureWithLargestChildEnabled
(boolean)

当设置为 true 时,所有有重量的孩子都将被认为是最大孩子的最小尺寸。 

android:orientation

setOrientation(int)

布局应该是一列还是一行?对行使用“horizontal”,对列使用“vertical”。 

android:weightSum

setWeightSum(float)

定义最大权重总和。


LinearLayout.LayoutParams


       LinearLayout包含的所有子元素都受LinearLayout.LayoutParams控制,因此LinearLayout包含的子元素可以额外指定下列属性。


LinearLayout.LayoutParams常用XML属性和相关方法说明


XML属性

相关方法

说明

android:layout_gravity

setGravity(int)

Gravity指定组件应如何放置在其单元组中。

必须是Gravity常量值中的一个或多个(以“|”分隔)。

android:layout_weight

指示 LinearLayout 中有多少额外空间分配给

与这些 LayoutParams 关联的视图。 


Gravity常量(必须使用一个或多个以“|”分隔。如:right|top)


Constant

Value

描述

center

11

将对象放置在其容器的垂直和水平轴的中心,不改变其大小。

center_horizontal

1

将对象放置在其容器的水平中心,不改变其大小。

center_vertical

10

将对象放在其容器的垂直中心,不改变其大小。

clip_horizontal

8

可以设置为将子项的左边缘和/或右边缘剪裁到其容器边界的附加选项。剪辑将基于水平重力:左重力将剪辑右边缘,右重力将剪辑左边缘,两者都不会剪辑两个边缘。

clip_vertical

80

可以设置为将子项的顶部和/或底部边缘剪裁到其容器边界的附加选项。剪辑将基于垂直重力:顶部重力将剪辑底部边缘,底部重力将剪辑顶部边缘,两者都不会剪辑两个边缘。

fill

77

如果需要,增加对象的水平和垂直大小,使其完全填满其容器。

fill_horizontal

7

如果需要,增加对象的水平尺寸,使其完全填满其容器。

fill_vertical

70

如果需要,增大对象的垂直尺寸,使其完全填满其容器。

left

3

将对象推到其容器的左侧,不改变其大小。

right

5

将对象推到其容器的右侧,不改变其大小。

bottom

50

将对象推到其容器的底部,而不改变其大小。

top

30

将对象推到其容器的顶部,而不改变其大小。

start

800003

将对象推到其容器的开头,不改变其大小。

end

800005

将对象推到其容器的末端,不改变其大小。


均等分布


       如要创建线性布局,让每个子组件使用大小相同的屏幕空间,请将每个视图的android:layout_height设置为"0dp"(针对垂直布局),或将每个视图的android:layout_width设置为"0dp"(针对水平布局)。然后,请将每个视图的android:layout_weight设置为"1"。例如:

image.png


<?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">
    <LinearLayout
        android:id="@+id/ll_top"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:background="@color/color_188FFF"
        android:orientation="horizontal"
        android:layout_height="0dp">
    </LinearLayout>
    <LinearLayout
        android:id="@+id/ll_bottom"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:background="@color/color_ff0000"
        android:layout_height="0dp">
    </LinearLayout>
</LinearLayout>


不等分布


       你也可创建线性布局,让子元素使用大小不同的屏幕空间:


       a、如果有三个文本字段,其中两个声明权重为 1,另一个未赋予权重,那么没有权重的第三个文本字段就不会展开,而仅占据其内容所需的区域。另一方面,另外两个文本字段将以同等幅度展开,填充测量三个字段后仍剩余的空间。


       b、如果有三个文本字段,其中两个字段声明权重为 1,而为第三个字段赋予权重 2(而非 0),那么现在相当于声明第三个字段比另外两个字段更为重要,因此,该字段将获得总剩余空间的一半,而其他两个字段均享余下的空间。


image.png


<?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">
    <LinearLayout
        android:id="@+id/ll_top"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:background="@color/color_188FFF"
        android:orientation="horizontal"
        android:layout_height="0dp">
        <View
            android:id="@+id/view_top_1"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:background="@color/color_ff0000"/>
        <View
            android:id="@+id/view_top_2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@color/purple_500"/>
        <View
            android:id="@+id/view_top_3"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:background="@color/color_FF773D"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/ll_bottom"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:background="@color/color_ff0000"
        android:layout_height="0dp">
        <View
            android:id="@+id/view_bottom_1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@color/color_FF773D"/>
        <View
            android:id="@+id/view_bottom_2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:background="@color/teal_200"/>
        <View
            android:id="@+id/view_bottom_3"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@color/color_ff0000"/>
    </LinearLayout>
</LinearLayout>


二、相对布局(RelativeLayout常用)


      RelativeLayout 是一个视图组,每个子组件位置是相对的,可以相对于同一层级下其他控件,也可以相对于父控件。


       RelativeLayout是用于设计用户界面的非常强大的实用程序,因为它可以消除嵌套视图组并保持布局层次结构平坦,从而提高性能。如果你发现自己使用了多个嵌套LinearLayout组,则可以将它们替换为单个RelativeLayout。


定位视图


       RelativeLayout让子视图指定它们相对于父视图或彼此的位置(由 ID 指定)。因此,如果A组件的位置是由B组件的位置来决定,Android要求先定义B组件,再定义A组件


RelativeLayout常用XML属性和相关方法说明


XML属性

相关方法

说明

android:gravity

setGravity(int)

指定对象应如何在其自身边界内在X轴和Y轴上定位其内容。

必须是Gravity常量值中的一个或多个(以“|”分隔)。 

android:ignoreGravity

setIgnoreGravity(int)

指示哪个视图不应受重力影响。


RelativeLayout.LayoutParams


       为了控制RelativeLayout布局容器中各子组件的布局分布,RelativeLayout提供了一个内部类:RelativeLayout.LayoutParams,该类提供了大量的XML属性来控制RelativeLayout布局容器中子组件的布局分布。


RelativeLayout.LayoutParams里设的XML属性及说明


XML属性

说明

android:layout_above

将此视图的底部边缘定位在给定的锚视图 ID 上方。 

android:layout_alignBaseline

将此视图的基线定位在给定锚视图 ID 的基线上。 

android:layout_alignBottom

使此视图的底部边缘与给定的锚视图 ID 的底部边缘匹配。 

android:layout_alignEnd

使此视图的结束边缘与给定锚视图 ID 的结束边缘匹配。 

android:layout_alignLeft

使此视图的左边缘与给定锚视图 ID 的左边缘匹配。 

android:layout_alignParentBottom

如果为 true,则使此视图的底部边缘与父视图的底部边缘匹配。 

android:layout_alignParentEnd

如果为 true,则使此视图的结束边缘与父视图的结束边缘匹配。 

android:layout_alignParentLeft

如果为 true,则使此视图的左边缘与父视图的左边缘匹配。 

android:layout_alignParentRight

如果为 true,则使此视图的右边缘与父视图的右边缘匹配。 

android:layout_alignParentStart

如果为 true,则使此视图的起始边缘与父视图的起始边缘匹配。 

android:layout_alignParentTop

如果为 true,则使此视图的顶部边缘与父视图的顶部边缘匹配。 

android:layout_alignRight

使此视图的右边缘与给定锚视图 ID 的右边缘匹配。 

android:layout_alignStart

使此视图的起始边缘与给定锚视图 ID 的起始边缘匹配。 

android:layout_alignTop

使此视图的顶部边缘与给定的锚视图 ID 的顶部边缘匹配。 

android:layout_alignWithParentIfMissing

如果设置为 true,则在 layout_toLeftOf、layout_toRightOf 等无法找到锚点时,将使用父级作为锚点。 

android:layout_below

将此视图的顶部边缘定位在给定的锚视图 ID 下方。 

android:layout_centerHorizontal

如果为 true,则此子项在其父项内水平居中。 

android:layout_centerInParent

如果为 true,则此子项在其父项内水平和垂直居中。 

android:layout_centerVertical

如果为 true,则将此子项垂直居中于其父项内。 

android:layout_toEndOf

将此视图的起始边缘定位到给定锚视图 ID 的末尾。 

android:layout_toLeftOf

将此视图的右边缘定位在给定锚视图 ID 的左侧。 

android:layout_toRightOf

将此视图的左边缘定位在给定锚视图 ID 的右侧。 

android:layout_toStartOf

将此视图的结束边缘定位到给定锚视图 ID 的开始处。 

android:layout_above

将此视图的底部边缘定位在给定的锚视图 ID 上方。 


    除此之外,RelativeLayout.LayoutParams还继承了ViewGroup.MarginLayoutParams,因此RelativeLayout布局容器中每个子组件也可以指定ViewGroup.MarginLayoutParams所支持的各XML属性。


不设置相对位置(重叠在一起)


image.png


<?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="match_parent">
    <View
        android:id="@+id/view_top_1"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@color/color_666666"/>
    <View
        android:id="@+id/view_top_2"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:background="@color/teal_200"/>
    <View
        android:id="@+id/view_top_3"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="@color/color_FF773D"/>
</RelativeLayout>


设置相对位置,未出现重叠


image.png


<?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="match_parent">
    <View
        android:id="@+id/view_top_1"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@color/color_666666"/>
    <View
        android:id="@+id/view_top_2"
        android:layout_width="200dp"
        android:layout_below="@id/view_top_1"
        android:layout_height="100dp"
        android:background="@color/teal_200"/>
    <View
        android:id="@+id/view_top_3"
        android:layout_width="100dp"
        android:layout_below="@id/view_top_2"
        android:layout_height="100dp"
        android:background="@color/color_FF773D"/>
    <View
        android:id="@+id/view_top_4"
        android:layout_width="100dp"
        android:layout_below="@id/view_top_2"
        android:layout_toRightOf="@id/view_top_3"
        android:layout_height="100dp"
        android:background="@color/purple_500"/>
</RelativeLayout>
相关文章
|
6月前
|
XML Android开发 数据安全/隐私保护
10. 【Android教程】网格布局 GridLayout
10. 【Android教程】网格布局 GridLayout
326 1
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
4月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
71 10
|
6月前
|
Android开发
08. 【Android教程】相对布局 RelativeLayout
08. 【Android教程】相对布局 RelativeLayout
89 0
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
147 0
|
4月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
67 1
|
5月前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
136 15
|
4月前
|
XML 数据可视化 API
Android经典实战之约束布局ConstraintLayout的实用技巧和经验
ConstraintLayout是Android中一款强大的布局管理器,它通过视图间的约束轻松创建复杂灵活的界面。相较于传统布局,它提供更高灵活性与性能。基本用法涉及XML定义约束,如视图与父布局对齐。此外,它支持百分比尺寸、偏移量控制等高级功能,并配有ConstraintSet和编辑器辅助设计。合理运用可显著提高布局效率及性能。
260 0
|
4月前
|
Android开发
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
64 0
|
5月前
|
XML Android开发 数据安全/隐私保护
使用RelativeLayout布局Android界面
使用RelativeLayout布局Android界面