Activity主程序

image-20220905194746146


image-20220905194813650


应用程序组成

Android应用程序由松散耦合的组件组成并使用Manifest绑定在一起。文件Manifest描述了每一个组件和他们的交互方式,还用于指定应用程序元数据、平台要求、外部库以及必须的权限。

组件(除Intent的话,称为四大组件:D)

提供了应用程序的基本结构模块

Activity(最重要)

  • 对应各种各样的界面。

    • 一个Activity代表一个单独的屏幕,可以添加多个控件,如Button、TextView单独,组成和用户交互的用户界面。
  • Activity用进行管理,当前活动的Activity位于栈顶。随着不同应用的运行,每个Activity都有可能从活动状态转入非活动状态,也可能从非活动状态转入活动状态。

  • 由java文件和xml文件构成。

Service

  • 后台服务

Intent

  • 实现在Activity之间的跳转,并且传递数据

Content Provider

  • 用于在不同app之间传递数据

BroadcastReceiver

  • 广播
  • 对外部事件进行相应

Android用户界面框架

MVC模型

image-20220905194534158

image-20220905172719934

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程序的界面布局的两种方法

  1. 使用XML文件描述界面布局(推荐使用)
  • 将程序的表现层和控制层分离,修改界面时无需更改程序源代码
  • 可以通过“可视化编辑器”直接查看用户界面,有利于加快界面设计过程
  1. 在程序运行时动态添加或修改界面布局

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
2
android:layout_width="match_parent"
android:layout_height="wrap_content"
  • match_parent表示匹配父容器
  • wrap_content表示匹配内容,即表示和自身内容一样的长度
设置控件的权重

决定剩余空间的分配

1
android:layout_weight="1"

控件会根据自身权重,尽可能的占用剩余的空间

设置控件的位置

相当于RelativeLayout中的android:layout_alignRight

1
android:layout_gravity="right"

image-20220915195638209

设置控件内容的位置
1
android:gravity="top"

image-20220915195734398

GridLayout

网格布局

在网格布局中,一个组件可以跨多行或多列;

行号、列号从0开始;

image-20220925082836456

属性

布局属性

  • alignmentMode:设置布局管理器的对齐方式
  • columnCount:设置网格列的数量
  • rowCount:设置网格行的数量

组件属性

  • layout_column:指定组件在第几列显示
  • layout_row:指定组件在第几行显示
  • layout_columnSpan:设置组件占据的列数
  • layout_rowSpan:设置组件占据的行数
  • layout_columnWeight:设置列的权重
  • layout_rowWeight:设置行的权重

RelativeLayout

相对布局

需要在控件中使用,用于指定控件与控件、父级Layout与控件之间的相对位置

image-20220925083427607

属性

相对于父元素给控件布局,属性值为“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包及其子包中。常用组件如图:

image-20220925095755491

View的常见属性

image-20220925100020152

颜色属性

android系统在android.graphics.Color中定义了12种常见的颜色常数。

image-20220925100437821

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

滚动条

Button

ImageButton