Activity主程序
应用程序组成
Android应用程序由松散耦合的组件组成并使用Manifest绑定在一起。文件Manifest描述了每一个组件和他们的交互方式,还用于指定应用程序元数据、平台要求、外部库以及必须的权限。
组件(除Intent的话,称为四大组件:D)
提供了应用程序的基本结构模块
Activity(最重要)
对应各种各样的界面。
- 一个Activity代表一个单独的屏幕,可以添加多个控件,如Button、TextView单独,组成和用户交互的用户界面。
Activity用
栈
进行管理,当前活动的Activity位于栈顶。随着不同应用的运行,每个Activity都有可能从活动状态转入非活动状态,也可能从非活动状态转入活动状态。由java文件和xml文件构成。
Service
- 后台服务
Intent
- 实现在Activity之间的跳转,并且传递数据
Content Provider
- 用于在不同app之间传递数据
BroadcastReceiver
- 广播
- 对外部事件进行相应
Android用户界面框架
MVC模型
View Tree 视图树模型
对应一个xml文件
View
最基本的可视单元(非容器类从View衍生出来)
- 存储了屏幕上特定矩形区域内所显示内容的
数据结构
- 实现所占据区域的
界面绘制
、焦点变化
、用户输入
和界面事件处理
等 - 一个
重要的基类
,所有在界面上的可见元素都是View的子类
ViewGroup
一种能够承载含多个View的显示单元,ViewGroup类通常作为控件的容器使用(容器类继承自ViewGroup)
- 承载界面布局
- 承载具有原子特征的重构模块
Android系统绘制界面的规则
依据视图树的结构从上至下
绘制每一个界面元素,每个元素负责自身的绘制,如果元素包含子元素,该元素就会通知其下的元素进行绘制。
线程
Android中主线程主要负责UI的刷新,UI相关的操作都需要在主线程处理。 处理时的注意事项:耗时的操作,例如文件I/O处理,网络请求不要在主线程处理,需要在子线程处理。
单线程用户界面
控制器从队列中获取事件和视图
在屏幕上绘制用户界面
,使用的都是同一个线程
特点
处理函数具有顺序性
,能够降低应用程序的复杂程度,同时也能减低开发的难度
缺点
如果事件处理函数过于复杂,可能导致用户界面失去响应
多线程用户界面
优点
多线程执行任务,可以并发执行多个任务,增加处理效率。
缺点
多线程增加任务处理的复杂度,如果线程之间需要使用共享变量的时候,需要考虑线程之间的同步。
Android界面元素
- View(不展开了)
- 所有可视界面元素(通常称为控件或小组件)的基类
- ViewGroup(不展开了)
- 视图类的拓展,其中包含多个子视图
- 布局管理
- 管理控件的布局格式,组织界面中控件的呈现方式
- Activity
- 用于为用户呈现窗口或屏幕
- Fragment
- 针对不同屏幕尺寸时,优化UI布局以及创建可重用的UI元素
组件宽高单位
px
像素,在分辨率不同的手机上显示出来的大小不一样
dp
设备独立像素,密度无关像素,兼容不同分辨率的设备,一般用于设置控件宽高
sp
放大像素,可伸缩像素,和dp一样兼容不同分辨率的设备,用于字体
pt
磅数,与px相似,用于字体(不推荐)
布局管理
UI布局(Layout)
定义界面中所有的元素、结构和相互关系
在对应的Java文件中使用
1 | setContentView(R.layout.<layout_name>) |
设置对应的xml文件。
小技巧:
使用Ctrl键,按一下<layout_name>可以定位到对应的xml文件。
申明Android程序的界面布局的两种方法
- 使用XML文件描述界面布局(推荐使用)
- 将程序的表现层和控制层分离,修改界面时无需更改程序源代码
- 可以通过“可视化编辑器”直接查看用户界面,有利于加快界面设计过程
- 在程序运行时动态添加或修改界面布局
Android Studio可视化布局设计界面
- 左屏用于展示界面实际渲染状态
- 右屏可以展示布局层次结构,右屏上的每一个布局与组件的id都被标记出来,有利于开发者快速掌握布局结构
在Android开发当中,界面的设计通过布局文件实现的,布局文件采用XML的格式,每个应用程序默认会创建一个activity_main.xml布局文件,它是应用启动的界面。
我们可以通过,File->New->XML或者在layout文件夹右击新建xml文件,来创建一个新的布局文件,文件名的字母必须全部小写
,在Root Tag中选择布局类型。添加控件,可以直接在图形化界面上进行拖拽操作,再对代码进行修改。
Root Tag 布局方式
常见的布局类型如下
constraintlayout
约束布局
构建方法
- 将现有布局转化为约束布局
- 打开布局,在Design视图中,Component Tree窗口,右键布局,然后点击Convert layout to ConstraintLayout
- 直接新建约束布局
- 新建布局文件(New>XML>Layout XML File),将”androidx.constraintlayout.widget.ConstraintLayout“作为Root Tag标签
如果组件不设置约束,在运行时,将定位至左上方,和Design视图效果不一致。
linearlayout
线性布局
属性
指明控件排布方式(垂直/水平)使用
1 | android:orientation="vertical/horizontal" |
设置控件的宽高
1 | android:layout_width="match_parent" |
match_parent
表示匹配父容器wrap_content
表示匹配内容,即表示和自身内容一样的长度
设置控件的权重
决定剩余空间的分配
1 | android:layout_weight="1" |
控件会根据自身权重,尽可能的占用剩余的空间
设置控件的位置
相当于RelativeLayout中的android:layout_alignRight
1 | android:layout_gravity="right" |
设置控件内容的位置
1 | android:gravity="top" |
GridLayout
网格布局
在网格布局中,一个组件可以跨多行或多列;
行号、列号从0开始;
属性
布局属性
- alignmentMode:设置布局管理器的对齐方式
- columnCount:设置网格列的数量
- rowCount:设置网格行的数量
组件属性
- layout_column:指定组件在第几列显示
- layout_row:指定组件在第几行显示
- layout_columnSpan:设置组件占据的列数
- layout_rowSpan:设置组件占据的行数
- layout_columnWeight:设置列的权重
- layout_rowWeight:设置行的权重
RelativeLayout
相对布局
需要在控件中使用,用于指定控件与控件、父级Layout与控件之间的相对位置
属性
相对于父元素给控件布局,属性值为“True/False”
- android:layout_centerHrizontal 水平居中
- android:layout_centerVertical 垂直居中
- android:layout_centerInparent 相对于父元素完全居中
- android:layout_alignParentBottom 位于父元素的下边缘
- android:layout_alignParentLeft 位于父元素的左边缘
- android:layout_alignParentRight 位于父元素的右边缘
- android:layout_alignParentTop 位于父元素的上边缘
- android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物
属性值必须为id的引用名“@id/id-name”
- android:layout_below 位于元素的下方
- android:layout_above 位于元素的的上方
- android:layout_toLeftOf 位于元素的左边
- android:layout_toRightOf 位于元素的右边
- android:layout_alignTop 该元素的上边缘和某元素的的上边缘对齐
- android:layout_alignLeft 该元素的左边缘和某元素的的左边缘对齐
- android:layout_alignBottom 该元素的下边缘和某元素的的下边缘对齐
- android:layout_alignRight 该元素的右边缘和某元素的的右边缘对齐
给属性赋予像素值
- android:layout_marginBottom 底边缘的距离
- android:layout_marginLeft 左边缘的距离
- android:layout_marginRight 右边缘的距离
- android:layout_marginTop 上边缘的距离
FrameLayout
帧布局(基本不用)
六大布局中最为简单的一个布局,这个布局直接在屏幕上开辟出一块空白的区域,当我们往里面添加控件的时候,会默认把他们放到这块区域的左上角,而这种布局方式却没有任何的定位方式。
当添加多个组件时,后面的组件将遮盖之前的组件。
TableLayout
表布局(不常用)
表格布局类似网格布局
属性
使用<tablerow>定义行
android:collapseColumns:设置需要被隐藏的列的序号
android:shrinkColumns:设置允许被收缩的列的列序号
android:stretchColumns:设置运行被拉伸的列的列序号、
AbsoluteLayout
绝对布局(不推荐)
绝对布局就是可以设置布局内 View 及 ViewGroup 所在的绝对位置,如下图所示,直接对他的子 View 设置 X / Y 坐标,然后 Android 系统就会帮我们将各个 View 摆放到相应的位置。
属性
- android:id:
唯一标识当前 View 的 id - android:layout_x:
设置 View 的横坐标 - android:layout_y:
设置 View 的纵坐标
需注意这里所设置的横纵坐标均是 View 左上角的坐标,不是中心点
UI控件
大多数用户界面组件都放在widget包及其子包中。常用组件如图:
View的常见属性
颜色属性
android系统在android.graphics.Color中定义了12种常见的颜色常数。
TextView
文本框
功能:用于显示文本的一个控件
基本属性
- id:为TextView设置一个组件id,根据id,我们可以在Java代码中通过findViewById()的方法获取到该对象,然后进行相关属性的设置,又或者使用RelativeLayout时,参考组件用的也是id!
- layout_width:组件的宽度,一般写:wrap_content或者**match_parent(fill_parent)**,前者是控件显示的内容多大,控件就多大,而后者会填满该控件所在的父容器;当然也可以设置成特定的大小,比如我这里为了显示效果,设置成了200dp。
- layout_height:组件的高度,内容同上。
- gravity:设置控件中内容的对齐方向,TextView中是文字,ImageView中是图片等等。
- text:设置显示的文本内容,一般我们是把字符串写到string.xml文件中,然后通过@String/xxx取得对应的字符串内容的,这里为了方便我直接就写到””里,不建议这样写!!!
- textColor:设置字体颜色,同上,通过colors.xml资源来引用,别直接这样写!
- textStyle:设置字体风格,三个可选值:normal(无效果),bold(加粗),italic(斜体)
- textSize:字体大小,单位一般是用sp!
- background:控件的背景颜色,可以理解为填充整个控件的颜色,可以是图片哦!
EditText
输入框
属性
inputTpye:可用于限制EditText输入类型,控制虚拟键盘的类型
android:inputType=”none”
android:inputType=”text” //文本类型
android:inputType=”textCapCharacters”
android:inputType=”textCapWords”
android:inputType=”textCapSentences”
android:inputType=”textAutoCorrect”
android:inputType=”textAutoComplete”
android:inputType=”textMultiLine”
android:inputType=”textImeMultiLine”
android:inputType=”textNoSuggestions”
android:inputType=”textUri”
android:inputType=”textEmailAddress”
android:inputType=”textEmailSubject”
android:inputType=”textShortMessage”
android:inputType=”textLongMessage”
android:inputType=”textPersonName”
android:inputType=”textPostalAddress”
android:inputType=”textPassword” //密码
android:inputType=”textVisiblePassword” //可见密码
android:inputType=”textWebEditText”
android:inputType=”textFilter”
android:inputType=”textPhonetic”
android:inputType=”number” //数字
android:inputType=”numberSigned”
android:inputType=”numberDecimal”
android:inputType=”phone” //拨号键盘
android:inputType=”datetime”
android:inputType=”date” //日期键盘
android:inputType=”time” //时间键盘
ScrollView
滚动条