一、相对布局RelativeLayout
RelativeLayout的下级视图的位置是相对位置,得有具体的参照物才能确定最终位置。
如果不设定下级视图的参照物,那么下级视图默认显示在RelativeLayout内部的左上角。
用于确定视图位置的参照物分两种,一种是与该视图自身平级的视图,另一种是该视图的上级视图(也就是RelativeLayout)。
与参照物对比,相对位置在布局中的属性值与代码中的类型值
相对布局的演示效果
二、框架布局FrameLayout
FrameLayout也是较常用的布局,其下级视图无法指定所处的位置,只能统统从上级FrameLayout的左上角开始添加,并且 后面添加的子视图会把之前的子视图覆盖掉。
框架布局一般用于需要重叠显示的场合,比如绘图、游戏界面等,常见属性说明如下。
foreground:指定框架布局的前景图像。该图像在框架内部永远处于最顶层,不会被框架内的其他视图覆盖。
foregroundGravity:指定前景图像的对齐方式。该属性的取值说明同gravity。
框架布局的演示效果
三、复选框CheckBox
CompoundButton类是抽象的复合按钮,因为是抽象类,所以不能直接使用。实际开发中用的是CompoundButton类的几个派生类,主要有复选框CheckBox、单选按钮RadioButton以及开关按钮Switch。
CompoundButton在代码中可使用下列4种方法进行设置。
setChecked:设置按钮的勾选状态。
setButtonDrawable:设置左侧勾选图标的图形。
setOnCheckedChangeListener:设置勾选状态变化的监听器。
isChecked:判断按钮是否勾选。
例:
复选框
更换复选框左侧的勾选图像
可将布局文件中的button属性修改为自定义的勾选图形。下面是一个勾选图形状态定义的例子,如果是勾选状态,就显示图形check_choose;如果取消勾选,就显示图形check_unchoose。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/check_choose"/>
<item android:drawable="@drawable/check_unchoose"/> </selector>
例:更换勾选图像的示例界面
四、开关按钮Switch
Switch是一个高级版本的CheckBox,在选中与取消选中时可展现的界面元素比CheckBox丰富。
Switch允许设置开启/关闭时候的文本,也允许设置开关轨道的背景和图标。
Switch按钮的默认效果图
仿iOS的开关按钮
借助状态列表图形StateListDrawable,分别定义已选中时候的“开”图形,以及未选中时候的“关”图形。 状态列表图形的XML文件如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/switch_on"/>
<item android:drawable="@drawable/switch_off"/> </selector>
然后把CheckBox控件的background属性设置为该状态图形。
山寨后的开关按钮演示效果
四、单选按钮RadioButton
单选按钮要在一组按钮中选择其中一项,并且不能多选,这要求有个容器确定这组按钮的范围,这个容器便是RadioGroup。
RadioGroup实质上是个布局,同一组RadioButton都要放在同一个RadioGroup节点下。
下面是RadioGroup常用的3个方法。
check:选中指定资源编号的单选按钮。
getCheckedRadioButtonId:获取选中状态单选按钮的资源编号。
setOnCheckedChangeListener:设置单选按钮勾选变化的监听器。
下面是使用单选按钮的代码例子:
更换RadioButton的图标
如果通过button属性变更图标,那么图标与文字就会挨得很近,如下面的左图所示。
为了拉开图标与文字之间的距离,得换成drawableLeft属性展示新图标(不要忘了把button改为@null),此时再设置drawablePadding即可指定间隔距离。
修改效果如下面的右图所示
自定义按钮图标的三种方式
(1)button属性:主要用于图标大小要求不高,间隔要求也不高的场合。
(2)background属性:主要用于能够以较大空间显示图标的场合。
(3)drawableLeft属性:主要用于对图标与文字之间的间隔有要求的场合。
适配视图基础:
下拉框Spinner
数组适配器ArrayAdapter
简单适配器SimpleAdapter
五、下拉框Spinner
Spinner是下拉框,用于从一串列表中选择某项,功能类似于单选按钮的组合。
Spinner在代码中可调用下列4个方法。
setPrompt:设置标题文字。
setAdapter:设置下拉列表的适配器。适配器可选择ArrayAdapter或SimpleAdapter。
setSelection:设置当前选中哪项。注意该方法要在setAdapter方法后调用。
setOnItemSelectedListener:设置下拉列表的选择监听器,该监听器要实现接口OnItemSelectedListener。
下拉框的两种展现形式
一种是在当前下拉框的正下方展示列表,此时把spinnerMode设置为dropdown,如下面上图所示;
另一种是在页面中部以对话框形式展示列表,此时把spinnerMode设置为dialog,如下面下图所示。
六、数组适配器ArrayAdapter
适配器好比一组数据的加工流水线,你丢给它一大把糖果,适配器把糖果排列好顺序,然后拿来制作好的包装盒,把糖果往里面一塞,出来的便是一个个精美的糖果盒。
最简单的适配流水线就是之前演示Spinner用到的ArrayAdapter。
ArrayAdapter主要用于每行列表只展示文本的情况,有两道工序。
(1)第一道工序是构造函数,除了提供一堆原始数据外(六大行星的名称列表),还可以指定当前文本的样式。
(2)第二道工序是定义下拉列表的文本列表样式。
如何使用使用数组适配器
使用数组适配器的代码例子如下:
// 声明一个下拉列表的数组适配器
ArrayAdapter<String> starAdapter = new ArrayAdapter<String>(this, R.layout.item_select, starArray);
// 设置数组适配器的布局样式
starAdapter.setDropDownViewResource(R.layout.item_dropdown);
// 设置下拉框的数组适配器
sp.setAdapter(starAdapter);
七、简单适配器SimpleAdapter
ArrayAdapter只能显示文本列表,而SimpleAdapter允许在列表项中展示多个控件,包括文本与图片。
下面是SimpleAdapter的使用代码例子:
// 声明一个下拉列表的简单适配器,其中指定了图标与文本两组数据
SimpleAdapter starAdapter = new SimpleAdapter(this, list, R.layout.item_simple, new String[]{"icon", "name"}, new int[]{R.id.iv_icon, R.id.tv_name});
// 设置下拉框的简单适配器
sp.setAdapter(starAdapter);
使用简单适配器的行星列表效果
八、文本编辑框EditText
EditText是文本编辑框,用户可在此输入文本等信息。
EditText的常用属性说明如下。
inputType:指定输入的文本类型,代码中对应的方法是setInputType。输入类型的取值说明见表,若同时使用多种文本类型,则可使用竖线“|”把多种文本类型拼接起来。
maxLength:指定文本允许输入的最大长度。该属性无法通过代码设置。
hint:指定提示文本的内容,代码中对应的方法是setHint。
textColorHint:指定提示文本的颜色,代码中对应的方法是setHintTextColor。
EditText的输入类型说明
九、文本监听器TextWatcher
文本监听器接口TextWatcher用于监控输入文本的变化事件。该接口提供了3个监控方法,具体说明如下。
beforeTextChanged:在文本改变之前触发。
onTextChanged:在文本改变过程中触发。
afterTextChanged:在文本改变之后触发。 文本监听器的常用业务场景包括:
(1)在输入文本达到指定长度时自动隐藏输入法。
(2)如果监控到已输入回车符,就自动将焦点移到下一个控件,从而实现回车符自动跳转的要求。
十、自动完成编辑框AutoCompleteTextView
自动完成编辑框一般用于搜索文本框,如在电商App的搜索框输入商品文字时,下方会自动弹出提示词列表。
它的实现原理是:EditText结合监听器TextWatcher与下拉列表Spinner,一旦监控到EditText的文本发生变化,就自动弹出 适配好的文字下拉列表,选中具体的下拉项向EditText填入相应文字。
自动完成编辑框的属性和设置方法
自动完成编辑框的展示效果
十一、活动Activity基础
1.Activity的生命周期
下面是Activity与生命周期有关的方法说明。
onCreate:创建页面。把页面上的各个元素加载到内存中。
onStart:开始页面。把页面显示在屏幕上。
onResume:恢复页面。让页面在屏幕上活动起来,例如开启动画、开始任务等。
onPause:暂停页面。让页面在屏幕上的动作停下来。
onStop:停止页面。把页面从屏幕上撤下来。
onDestroy:销毁页面。把页面从内存中清除掉。
onRestart:重启页面。重新加载内存中的页面数据。
2.Activity的生命周期变化(上)
(1). 页面之间的跳转 首次打开页面ActJumpActivity,调用方法的顺序为:本页面onCreate→onStart→onResume 从 ActJumpActivity跳转到ActNextActivity,调用方法的顺序为:上一个页面onPause→下一个页面 onCreate→onStart→onResume→上一个页面onStop 从ActNextActivity回到ActJumpActivity(按返回键或在代码中调用finish方法),调用的方法顺序为:下一个页面onPause→上一个页面onRestart→onStart→onResume→下一个页面onStop→onDestroy
(2).竖屏与横屏的切换 首先进入测试页面ActRotateActivity,此时默认为竖屏显示;接着倒转手机切换到横屏,观察日志;然后倒转手机切换回竖屏,观察日志。 无论是竖屏切换到横屏,还是横屏切换到竖屏,都是原屏幕的页面从onPause到onStop再到onDestroy一路销毁,然后新屏幕的页面从onCreate到onStart再到onResume一路创建而来。
(3).按HOME键与返回App
回到桌面时,页面的生命周期从活动状态变为暂停状态。
返回App时,页面的生命周期又从暂停状态变为活动状态。
十二、使用Intent传递消息
1. Intent的中文名是意图,简单地说就是传递消息。Intent是各个组件之间信息沟通的桥梁,既能在Activity之间沟通,又能在Activity与Service之间沟通,也能在Activity与Broadcast之间沟通。
Intent用于Android各组件之间的通信,它主要有3部分工作:
(1)Intent需标明本次通信请求从哪里来、到哪里去、要怎么走。
(2)发起方携带本次通信需要的数据内容,接收方对收到的Intent数据进行解包。
(3)如果发起方要求判断接收方的处理结果,Intent就要负责让接收方传回应答的数据内容。
Intent组成元素的列表说明
2. 表达Intent路径的两种方式
一种是显式Intent,直接指定来源类与目标类名,属于精确匹配。
显式Intent的声明方式有如下3种:
(1)在构造函数中指定
(2)调用setClass方法指定
(3)调用setComponent方法指定
另一种是隐式Intent ,没有明确指定要跳转的类名,只给出一个动作让系统匹配拥有相同字串定义的目标,属于模糊匹配。
隐式Intent的动作名称通过setAction方法指定,更详细的过滤条件可通过setData方法和addCategory方法设置。
3.向下一个Activity传递参数
传递参数的两种方式包括:
(1)调用putExtra方法。Intent重载了很多种putExtra方法传递各种类型的参数,包括String、int、double等基本数据类型,甚至Parcelable、Serializable等序列化结构。
(2)调用putExtras方法。Bundle内部用于存放数据的实质结构是Map映射,可添加元素、删除元素,还可判断元素是否存在。开发者把Bundle全部打包好只需调用一次putExtras方法,把Bundle全部取出来也只需调用一次getExtras方法。
4.向上一个Activity返回参数
接收返回参数的编码步骤如下:
(1)前一个页面打包好请求数据,调用方法startActivityForResult(Intent intent, int requestCode),表示需要处理结果数据。
(2)后一个页面接收请求数据,进行相应处理。
(3)后一个页面在返回前一个页面时,打包应答数据并调用setResult方法返回信息。
(4)前一个页面重写方法onActivityResult,并对应答数据进行解包处理。