Android : layout


布局(Layout) 的概念针对的是Activity。
Activity是布满整个Android设备的窗口或者悬浮于其他窗口上的交互界面。
XML布局文件是Android系统中定义 Layout 的常用方式,所有布局文件都包含在 res/layout 目录中。
当 res/layout 目录下新增了布局文件后,R.java文件会自动收录该布局资源,Java代码可通过setContentView 方法在Activity中显示该Layout。

Fragment

Fragment,简称碎片/片段。依赖于Activity,不能独立存在。
每个Fragment有自己的布局,事件和完整的生命周期。
一个Activity里可以有多个Fragment,一个Fragment可以被多个 Activity 重用。

在引入Fragment之前,由于每次给定的一个时间点在屏幕上只能显示一个Activity,无法分割设备屏幕并且独立的控制不同的部分。
随着Fragment的引入,获得了更大的灵活性。虽然一个时间点在屏幕上只有一个Activity,但一个Activity可以由多个Fragment组成。

为了能够更好的支持多分辨率设备的UI设计引入的。通过将Activity布局分成片段,可以在运行时修改Activity的外观,动态的 添加/移除 Fragment,实现Activity的多态。
在这里插入图片描述
通过继承Fragment类来创建碎片。
加载Fragment:setFragment
创建完Fragment后,就可以把Fragment添加到Activity中。
在Activity中添加Fragment的方式有两种:
静态添加:通过xml的方式添加,缺点是一旦添加就不能在运行时删除。
动态添加:运行时添加,这种方式比较灵活,因此建议使用这种方式。

Context

提供了关于应用环境全局信息的接口。它的执行被Android系统所提供。它允许获取以应用为特征的资源和类型,是一个统领一些资源(应用程序环境变量等)的上下文。
它描述一个应用程序环境的信息(即上下文);是一个抽象类,Android提供了该抽象类的具体实现类;通过它我们可以获取应用程序的资源和类(包括应用级别操作,如启动Activity,发广播,接受Intent等)
setContentView给布局设置内容

Include

可以实现在一个layout中引用另一个layout的布局,通常适合于界面布局复杂、不同界面有共用布局的APP中,如一个APP顶部布局、侧边栏布局、底部Tab栏布局。
将这些同一个APP中有多个界面用到的布局抽取出来,再通过include标签引用,既可以降低layout的复杂度,又可以做到布局重用(布局有改动时只需要修改一个地方就可以)
用法:include只需在布局文件中需要引用其它布局的地方,使用layout=“@layout/child_layout”

Merge

当遇到这个标签时,将<merge>内的元素添加到父元素里。
在进行android布局时,会有很多相同的布局,可以考虑到复用。
这时可以通过<include>和<merge>标签将复杂的布局包含在需要的布局中,减少重复代码的编写。

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="OK"/>
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="CANCEL"/>
</merge>

ViewStub

一个不可见的View类,用于在运行时按需加载布局。
只有代码中调用viewStub.inflate()或 viewStub.setVisible(visible) 方法时才可见。

selector

状态选择器。点击、选中、使能、聚焦等状态切换都会用到选择器。
<selector>根元素,包含一个或多个<item>元素。

在某些状态期间使用的可绘制对象,item使用各种属性来描述可绘制对象的图形的状态。
<item android:drawable=“@color/white” android:state_pressed=“true” />
可绘制对象资源:android:drawable
状态:
android:state_pressed 按下的状态(按下还没松开)
android:state_enabled 能够接受触摸或者点击事件
android:state_focused 是否取得焦点
android:state_selected 被选中
android:state_checked 用户选中了View,一般用于CheckBox
android:state_hovered 光标是否悬停,通常与focused相同
android:state_checkable 组件是否能被check。如RadioButton可被check
android:state_activated 是否被激活
android:state_window_focused 应用程序是否在前台,当有通知栏被拉下来或对话框弹出时就不在前台

selector.xml
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/white" android:state_pressed="true" />
    <item android:drawable="@color/green" />
</selector>
main.xml
<Button
    android:id="@+id/bt_about"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/selector" />

Layout

FrameLayout

帧布局 是六大布局中最为简单的一个布局,直接在屏幕上开辟出一块空白的区域,当往里面添加控件时,默认放到这块区域的左上角,没有任何的定位方式。
帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时刻只能看到最上面的那个组件。后续添加的控件会覆盖前一个。
前景图像:永远处于帧布局最上面,直接面对用户的图像,就是不会被覆盖的图片。
FrameLayout的两个属性
android:foreground:设置改帧布局容器的前景图像
android:foregroundGravity:设置前景图像显示的位置

LinearLayout

线性布局
orientation 布局中组件的排序方式:horizontal(水平) vertical(垂直,默认)
gravity 控制组件所包含的子元素的对齐方式,可多个组合,如(left|button)
layout_gravity 控制该组件在父容器里的对齐方式
layout_width 布局宽度
layout_height 布局高度
id 组件的资源id,可以通过findViewById(id)找到该组件
background 该组件设置一个背景图片或直接用颜色覆盖
weight 权重
divider 分割线

RelativeLayout

相对布局
gravity 设置容器内组件的对齐方式
ignoreGravity 设置了该属性为true的属性在组件,将不受gravity属性的影响
根据父容器定位
layout_alignParentLeft 左对齐
layout_alignParentRight 右对齐
layout_alignParentTop 顶部对齐
layout_alignParentBottom 底部对齐
android:layout_centerHorizontal 水平居中
android:layout_centerVertical 垂直居中
android:layout_centerInParent 中间位置
layout_toLeftOf 参考组件的左边
layout_toRightOf 参考组件的右边
layout_above 参考组件的上方
layout_below 参考组件的下方
layout_alignTop 对齐参考组件的上边界
layout_alignBottom 对齐参考组件的下边界
layout_alignLeft 对齐参考组件的左边界
layout_alignRight 对齐参考组件的右边界
设置组件与父容器的边距,又叫偏移
layout_margin 设置组件上下左右的偏移量
layout_marginLeft 设置组件离左边的偏移量
layout_marginRight 设置组件离右边的偏移量
layout_marginTop 设置组件离上边的偏移量
layout_marginBottom 设置组件离下边的偏移量
设置组件内部元素间的边距(比如Textview里的字体位置)
android:padding 往内容元素的上下左右填充一定边距
paddingLeft 往内容元素的左边填充一定边距
paddingRight 往内容元素的左边填充一定边距
paddingTop 往内容元素的上边填充一定边距
paddingBottom 往内容元素的下边填充一定边距

TableLayout

表格布局
android:collapseColumns:设置需要被隐藏的列的序号
android:shrinkColumns:设置允许被收缩的列的列序号
android:stretchColumns:设置运行被拉伸的列的列序号

AbsoluteLayout

绝对布局
四大控制属性(单位都是dp):
控制大小:
android:layout_width:组件宽度
android:layout_height:组件高度
控制位置:
android:layout_x:设置组件的X坐标
android:layout_y:设置组件的Y坐标

ConstraintLayout

约束布局。使用起来比RelativeLayout更灵活,性能更出色;可以按照比例约束控件位置和尺寸,能够更好地适配屏幕大小不同的机型。

layout_constraintLeft_toLeftOf
layout_constraintLeft_toRightOf
layout_constraintRight_toLeftOf
layout_constraintRight_toRightOf
layout_constraintTop_toTopOf
layout_constraintTop_toBottomOf
layout_constraintBottom_toTopOf
layout_constraintBottom_toBottomOf
layout_constraintStart_toEndOf
layout_constraintStart_toStartOf
layout_constraintEnd_toStartOf
layout_constraintEnd_toEndOf
layout_constraintBaseline_toBaselineOf:Baseline指的是文本基线
边距常用属性如下:
android:layout_marginStart
android:layout_marginEnd
android:layout_marginLeft
android:layout_marginTop
android:layout_marginRight
android:layout_marginBottom
layout_constraintHorizontal_bias 水平偏移 bias值=子View左相关的长度 / (子View左相关的长度
+ 其右相关的长度),默认值为0.5
layout_constraintVertical_bias 垂直偏移

红色区域为布局1
蓝色区域为布局2
黄色区域为布局3

padding 意味着该属性所在的主控件中内部布局(子控件)的边距。
如下图:
当设置布局2 的padding属性时,其实影响的是在其内部的布局3 与 布局2 的距离。
margin 与 padding属性相反。Android布局中,margin表示该属性所在的主控件里外部布局(父控件)的边距。
当设置布局2 的margin属性时,其实影响的是在其外部的布局1 与 布局2的距离。

在这里插入图片描述
layoutInflater.inflate()
用于加载布局
ayoutInflater.inflate 方法似于 findViewById 方法,不同点是layoutInflater.inflate
用来找 res/layout/ 下的XML布局文件,并且实例化;
而findViewById 是找 XML布局文件下的具体控件(如Button、TextView)。

使用场景:
1、对于一个没有被载入或者想要动态载入的界面,都需要使用 layoutInflater.inflater 来载入界面。
2、对于一个已经载入的界面,可以使用activity.findViewById 来获取界面中的控件。

View inflate (int resource, ViewGroup root) => attachToRoot=true
View inflate (int resource, ViewGroup root, boolean attachToRoot)

用法:
LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(R::layout::111, R::layout::222);

LayoutParams
继承于 Android.View.ViewGroup.LayoutParams.
LayoutParams 相当于一个 Layout 的信息包,封装了 Layout 的位置、高、宽等信息。
假设在屏幕上一块区域是由一个 Layout 占领,如果将一个 View 添加到此 Layout 中,
需告诉用户期望的布局方式,也就是将一个认可的 layoutParams 传递进去。

用法:
LayoutParams getLayoutParams(View* pView)
setLayoutParams(View* pView, LayoutParams& layoutParams)

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夏与冬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值