学习目标:
参考附件,完成所学知识点的整理,形式不限,内容包括已学的章节内容,大致包括:
- Activity的基本概念,生命周期,Intent的数据传递方法
- 基本控件和常用布局的基本概念、必填参数
- 菜单的类型,如何创建
- 常用资源的类型及定义
- Fragment的基本概念,创建及与Activity的交互
学习内容:
1.Activity的基本概念,生命周期,Intent的数据传递方法
什么是Activity?
Activity的中文含义是“活动”,它提供可视化的用户界面,通过界面的事件监听与用户交互完成某项任务。Activity是Android四大组件中最基础的组件,也是使用频率最高的组件。一个 Activity对象代表一个窗口,该窗口通常充满屏幕,也可以是非全屏的悬浮窗体或对话框。
Activity集合采用栈结构进行管理(如下图):
Activity的生命周期:
Activity的生命周期有7个方法和3个循环:
onCreate() 创建时调用
onRestart() 不可见到可见时调用
onStart() 用户可见时调用
onResume() 用户可交互时调用
onPause() 用户不可交互时调用
onStop() 用户不可见时调用
onDestroy() 销毁时调用
启动与退出的循环
Activity启动 onCreate() – onStart() – onResume()
Activity退出 onPause() – onStop() – onDestroy()
可见与不可见的循环
Activity不可见 onPause() – onStop()
Activity重新可见 onRestart() – onStart() – onResume()
焦点失去与获得的循环
Activity失去焦点 onPause()
Activity获得焦点 onResume()
Android的事件处理机制
在Activity的生命周期案例中,用户与应用程序的交互都是通过事件处理完成的。事件是程序设计过程中用户与应用程序进行交互的一种机制,如点击、长按、滑动等,Android提供了两种人机交互的处理机制:
基于回调的处理机制:Android的View都提供事件处理的回调方法,通过重写View的回调方法实现事件响应,没有被View处理的事件会被Activity的回调方法调用。
基于监听的处理机制:通过为Android的界面组件绑定特定的事件监听器,在事件监听器的方法中实现事件处理。
Activity的Intent的数据传递方法:
什么是Intent?
Intent被称为"意图",是对要执行的操作的描述。
Intent是用于从另一个应用组件请求一个动作的对象 。
Intent的功能有:
启动Activity
启动Service
发送Broadcast
Intent被分为两种类型,根据开启目标组件的方式不同:
显示意图
隐式意图
Intent数据传递:
Android提供Intent实现Activity之间的跳转以,Activity之间的数据传递也是通过Intent实现的。
Intent提供多个putExtra()重载方法传递基本类型、数组、字符串等类型的数据。
putExtra()方法包含两个参数,第一个参数是字符串类型的键值,第二个参数是传递的数据,相当于Intent对象使用了键值对传递数据。
使用Intent发送数据的两种方式:
data:使用setData()方法传递Uri类型的数据
intent.setData(Uri.parse(“http://www.baidu.com”));
intent.setData(Uri.fromFile(new File("/sdcard/sample.jpg")));
extras:使用Key-Value对传递数据
intent.putExtra(String name,int value); intent.putExtra(String name,
String[] value); intent.putExtras(Bundle bundle);
使用Intent接收数据的两种方式
data:使用getData0)方法接收Uri类型的数据
Uri locationUri =intent.getData();
extras:接收Key-Value对数据
int level = intent.getIntExtra(“level”,0);
Bundle bundle = intent.getExtras();
2.基本控件和常用布局的基本概念、必填参数
布局的介绍:
Android中一共有 六种布局。目前推荐使用 RelativeLayout、 LinearLayout、 GridLayout三种布局。上课也是主要讲了这三个。
LinearLayout:
(一)、概念:线性布局控制其中的控件或组件横向或纵向排列。在线性布局布局中,每一行或每一列只能放单独一个控件。线性布局不会换行。当控件排列到窗体边缘,后面的控件就被隐藏,而不会显示出来。
线性布局的默认方向是水平方向(Horizontal),还有一个选项是vertical。
(二)、 LinearLayout的常用 属性:
1.android:orientation 定义布局内控件或组件的排列方式
2.android:layout_width 定义控件的宽度
3.android:layout_height 定义控件的高度
4.android:id 设置控件的id。这样就可以在R.java中自动生成相应的值,在程序中通过findViewById就可以调用。
5.android:background 设置控件的背景颜色或背景图片
6.android:layout_weight 设置控件的权重。即各控件在水平或者垂直方向上平均分配。
7.android:gravity 该属性用来控制该View的内容物的位置。
8.android:layout_gravity 该属性用于设置控件相对于容器的对齐方式。
(三)、LinearLayout的特有属性:
1、android: orientation 布局管理器内组件的排列方式
2、android: gravity 设置布局管理器内组件的对齐方式
3、android: weightSum
(四)、 LinearLayout 子元素的特有属性:
1、android: layout_weight 子元素在 LinearLayout 中所占的权重
2、android: layout_gravity 子元素在 LinearLayout 中的对齐方式
RelativeLayout:
(一)、概念:指按着控件之间的相对位置来进行布局。
(二)、RelativeLayout特有属性:
1、android: gravity 设置布局容器内子控件的对齐方式
2、android: ignoreGravity 设置布局管理器内哪个控件不受gravity属性的影响
(三)、RelativeLayout子元素的特有属性: LayoutParams
A、第一组:指 兄弟控件之间的相对位置。该组属性的值是另一个控件的id。
layout_toRightOf 该控件在哪个控件的右侧
layout_toLeftOf 该控件在哪个控件的左侧
layout_above 该控件在哪个控件的上侧
layout_below 该控件在哪个控件的下侧
B、第二组:指 兄弟控件之间的对齐关系。该组属性的值是另一个控件的id。
layout_alignRight 该控件与哪个控件的右对齐
layout_alignLeft 该控件与哪个控件的左对齐
layout_alignTop 该控件与哪个控件的顶对齐
layout_alignBottom 该控件与哪个控件的底对齐
C、第三组:指 控件与父布局之间的对齐关系。该组属性的值是true或者false。
layout_alignParentRight 该控件与父布局控件的右对齐吗?
layout_alignParentLeft 该控件与父布局控件的左对齐吗?
layout_alignParentTop 该控件与父布局控件的顶端对齐吗?
layout_alignParentBottom 该控件与父布局控件的底部对齐吗?
layout_centerInParent 该控件位于父布局控件的中心位置吗?
layout_centerVertical 该控件位于父布局控件的垂直中心位置吗?
layout_centerHorizontal 该控件位于父布局控件的水平中心位置吗?
GridLayout:
(一)、GridLayout布局属性:
1、android:alignmentMode
属性说明:设置布局的对齐模式。可以取以下值:
alignBounds – 对齐子视图边界。
alignMargins – 对齐子视图边距。
2、android: columnCount
属性说明:GridLayout的最大列数
3、android: rowCount
属性说明:GridLayout的最大行数
4、android:orientation
属性说明:GridLayout中子元素的布局方向。有以下取值:
horizontal – 水平布局。
vertical – 竖直布局。
5、android:columnOrderPreserved
属性说明: 设置该网格布局是否保留列序号。默认是true。
6、android:rowOrderPreserved
属性说明: 设置该网格布局是否保留行序号。默认是true。
7、android:useDefaultMargins
属性说明: 设置GridLayout使用默认的边距。默认值是false。
(二)、GridLayout子元素的属性:
1、android: layout_column
属性说明: 显示该控件的列。例如,android:layout_column=“0”,表示在第1列显示该控件;android:layout_column=“1”,表示在第2列显示该控件。
2、android: layout_row
属性说明: 该控件所在行。例如,android:layout_row=“0”,表示在第1行显示该控件;android:layout_row=“1”,表示在第2行显示该控件。它和 android:layout_column类似。
3、android: layout_columnSpan
属性说明: 列合并。即该控件所占的列数。例如,android:layout_columnSpan=“2”,表示该控件占2列。
4、android: layout_rowSpan
属性说明: 行合并。即该控件所占的行数。例如,android:layout_rowSpan=“2”,表示该控件占2行。
5、android: layout_gravity
属性说明:该控件的布局方式。选项值:
top – 控件置于容器顶部,不改变控件的大小。
bottom – 控件置于容器底部,不改变控件的大小。
left – 控件置于容器左边,不改变控件的大小。
right – 控件置于容器右边,不改变控件的大小。
center_vertical – 控件置于容器竖直方向中间,不改变控件的大小。
fill_vertical – 如果需要,则往竖直方向延伸该控件。
center_horizontal – 控件置于容器水平方向中间,不改变控件的大小。
fill_horizontal – 如果需要,则往水平方向延伸该控件。
center – 控件置于容器中间,不改变控件的大小。
fill – 如果需要,则往水平、竖直方向延伸该控件。
clip_vertical – 垂直剪切,剪切的方向基于该控件的top/bottom布局属性。若该控件的gravity是竖直的:若它的gravity是top的话,则剪切该控件的底部;若该控件的gravity是bottom的,则剪切该控件的顶部。
clip_horizontal – 水平剪切,剪切的方向基于该控件的left/right布局属性。若该控件的gravity是水平的:若它的gravity是left的话,则剪切该控件的右边;若该控件的gravity是 right的,则剪切该控件的左边。
start – 控件置于容器的起始处,不改变控件的大小。
end – 控件置于容器的结束处,不改变控件的大小。
Android UI控件及UI组件:
(一)、控件名称:
TextView 文本视图
EditText 文本编辑框
Button 按钮
ImageView、Gallery 图像视图、画廊(建议过期)
ImageButton 图片按钮
ToggleButton 、Switch 开关按钮、开关
RadioButton 单选按钮
CheckBox 多选框
Spinner 下拉列表
AutoCompleteTextView 自动完成文本框
ProgressBar 进度条
SeekBar 拖动条
RatingBar 星级评分条
TimePicker、DatePicker 时间选择器、日期选择器
AnalogClock、DigitalClock 模拟时钟、数字时钟
Dialog(AlertDialog、ProgressDialog、TimePickerDialog、DatePickerDialog)提示对话框、进度对话框、时间选择对话框、日期选择对话框
ListView、GridView 列表视图【最重要的UI组件】、 网格视图
ScrollView 滚动视图
ExpandableListView 可展开列表视图
WebView 网页视图
SearchView 搜索框
TabHost 书签选项卡
Notification 、Toast 通知 、 吐司(短时提醒)
Menu(OptionMenu /SubMenu、ContextMenu) 菜单(选项菜单、上下文菜单)
ImageSwitcher、TextSwitcher 、 ViewPager 图像切换器、文本切换器
ActionBar 动作导航条
基本控件:——TextView:
(一)、TextView类结构:
java.lang.Object
↳ android.view.View
↳ android.widget.TextView
(二)、TextView 常用属性:
1、andorid: text 设置文本的内容
2、 android: textColor 设置文本的颜色
3、 android: textSize 设置文本的字体大小(sp)
4、andorid:height 设置文本的高度,以像素为单位
5、 android:width 设置文本的宽度,以像素为单位
6、 android: inputType 设置文本的类型。例如是普通文本,还是email,password,数字等等。
7、 android:singleLine 设置文本是否是单行显示。
8、android: gravity 设置文本框内文本的对齐方式。可选项有:top、bottom、left、right、center、fill、center_vertical、center_horizontal、fill_horizontal等等。这些属性值也可以同时指定,各属性值之间用竖线隔开。例如 right| bottom
9、android: drawableLeft 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。
10、android:drawableRight 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。
11、android:drawableTop 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。
12、android:drawableBottom 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。
13、android: autoLink 给指定的文本增加可单击的超链接。可选项为:none、web、email、phone、map和all。
多个选项之间使用“|”分隔,也可以使用all。
14、android: hint 设置当文本框内文本内容为空时,默认显示的提示性文字。
基本控件:——EditText:
(一)、 EditText 类结构:
java.lang.Object
↳ android.view.View
↳ android.widget.TextView
↳ android.widget.EditText
所以 EditText 继承了TextView的所有属性。
(二)、android: inputType的可选项:
android:inputType=“textPersonName”
android:inputType=“textPassword”
android:inputType=“numberPassword” 只可以输入数字
android:inputType=“textEmailAddress”
android:inputType=“phone” 只允许输入数字,括号等特殊符号,不可以输入字母。
android:inputType=“textPostalAddress”
android:inputType=“time”
android:inputType=“date”
android:inputType=“number”
基本控件:——Button:
(一)、Button类结构:
java.lang.Object
↳ android.view.View
↳ android.widget.TextView
↳ android.widget.Button
所以Button继承了TextView的所有属性。
3.菜单的类型,如何创建
我们学习了三种菜单样式:
选项菜单、弹出菜单、上下文菜单。
如何创建:
1.在res目录下创建menu文件夹。
2.在文件下创建名字是main菜单文件。
3.在main.xml文件创建两个选择,一个item代表一个选择,id是选择的唯一标识,title写的我们选择的名字创建代码如下,
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="删除" />
<item
android:id="@+id/remove_item"
android:title="添加" />
</menu>
4.实现点击让选择菜单弹出来
5.点击选择项促发事件
这时需要在活动重写onOptionsItemSelected()方法。
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()) {
case R.id.add_item:
Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
4.常用资源的类型及定义
android 有很多种类的资源,有7个是在res下新建目录然后将资源放在目录下:res/values,res/xml,res/layout,res/drawable,res/anim,res/menu,res/raw
还有一种是存放在res同级的目录assets目录下,也就是说大体上android资源种类有8类。
res/values : 存放字符串,颜色,尺寸,数组,主题,类型等资源。
res/xml : 可以是任意类型的xml文件,这些xml文件可以在运行时读
res/layout:布局文件
res/drawable:图片(bmp,png,gif,jpg等)
res/anim: xml格式的动画资源 (帧动画 和 补间动画)
res/menu:菜单资源
res/raw:会封装在apk,但是不会被编译,可以放任意类型文件,一般存放比较大的音频,视频,图片,文档,会在R类生成资源ID
assets:可以存放任意类型,不会被编译,与raw相比,不会在R类中生成资源ID
使用系统资源:
android sdk中 提供了大量的系统资源使用这些系统资源(sdk安装目录\platforms\android-2.2\data\res)
通过android.R.resourceType.resourceId 的方式
resourceType表示资源类型:String,Color,Drawable等,resouceId表示资源Id
在代码中键入android.R.会显示系统定义的资源。
5.Fragment的基本概念,创建及与Activity的交互
Fragment简介
Fragment的中文含义是“片段”或“碎片”,这表明Fragment是嵌在Activity中使用的UI片段,一个Activity中可以组合多个Fragment,多个Activity可重复使用某个Fragment。Fragment可以视为Activity的模块化组成部分,它具有自己的生命周期,能处理用户事件,并能在Activity运行时动态添加或移除,Android和Fragment的关系如图3.28所示。
综上所述,Fragment具备以下优势:
模块化Modularity:无需将所有代码写在Activity中,而是分别写在各自的Fragment中; 重用性Reuasbility:多个Activity可以重用一个Fragment; 适配性Adaptability:根据硬件的屏幕尺寸、屏幕方向,实现不同的布局。
Activity把值传递给Fragment
1 第一种方式,也是最常用的方式,就是使用Bundle来传递参数
Fragment中的onCreatView/onStart()方法中,通过getArgments()方法,获取到bundle对象,然后通过getString的key值拿到我们传递过来的值。
2 第二种方式,是在宿主Activity中定义方法,将要传递的值传递到Fragment中,在Fragment中的onAttach方法中,获取到这个值。
3 第三种方式,是扩展一下创建Fragment和传递数值。
Fragment把值传递给Activity
步骤
(1)在fragment中定义一个内部回调接口,再让包含该fragment的activity实现该回调接口,这样fragment即可调用该回调方法将数据传给activity。其实接口回调的原理都一样,以前的博客有讲到,接口回调是java不同对象之间数据交互的通用方法。
(2)activity实现完了接口怎么传给刚才的fragment呢?当fragment添加到activity中时,会调用fragment的方法onAttach(),这个方法中适合检查activity是否实现了OnArticleSelectedListener接口,检查方法就是对传入的activity的实例进行类型转换,然后赋值给我们在fragment中定义的接口。
(3)在一个fragment从activity中剥离的时候,就会调用onDetach方法,这个时候要把传递进来的activity对象释放掉,不然会影响activity的销毁,产生不必要的错误。注意看onAttach方法中的代码,在赋值之前要做一个判断,看看Activity中有没有实现了这个接口,用到了instanceof。如果没有实现接口,我们就抛出异常。
Fragment与Fragment之间的传值
在Activity中加载Fragment的时候、有时候要使用多个Fragment切换、并传值到另外一个Fragment、也就是说两个Fragment之间进行参数的传递,有两个方法。
1.通过共同的Activity传递(主要方法):在Activity里面添加一个字段、来临时保存要一些值。 在Activity中定义一个字段、然后添加set和get方法。
2.通过Bundle来传递(本质还是Activity–>Fragment)
Fragment与Activity之间的数据交互优点
(1)简单统一的数据传递方式;
(2)使用class传递数据,可以携带各种各样的数据,摆脱了用Bundle传递list和数组的麻烦;
(3)在前台组件Activity、Fragment、Service与Activity间,以及线程间传递大数据时的唯一选择。因为序列化大数据进行传递时,是十分耗时缓慢的,用EventBus是最优解法。
(4)清晰明了的主次线程;