android学习笔记24——事件处理
事件处理
android提供了两种事件处理机制:
1.基于回调的事件处理
2.基于监听器的事件处理(通过绑定特定事件监听器)
注意:
android对于基于回调的事件处理而言,主要做法就是重写android组件特定的回调方法,或者重写Activity的回调方法。
android为绝大部分界面组件提供了事件响应的回调方法,开发者只需要重写它们即可。
一般来说回调的事件处理可用于处理一些具有通用性的事件,基于回调的事件处理代码比较简介,但对于某些特定的事件,无法使用基于回调的事件处理,只能采用事件监听器的处理方式。
事件监听的处理模型
在事件监听的处理模型中,主要涉及如下三类对象:
1.event source:事件发生的场所,通常就是各个组件,Eg:按钮...
2.event:事件封装了界面组件上发生的特定事情——通常就是一次用户操作
3.event listener:负责监听事件源所发生的事件,并对各种事件做出相应的响应
android的事件处理机制是一种委派式(Delegation)事件处理方式:
普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。
注意:对于委派式,可以理解为分工协作的处理方式;委派式的处理方式将事件源和事件监听器分离,从而提供更好的程序模型,有利于提高程序的可维护性。
事件处理流程图如下:

对于事件处理,前面的学习比较中也有很多地方已经使用到,处理方式个人理解将其分为两种处理方式如下:
第一种处理方式:
public class MainActivity extends TabActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final TabHost tabHost = this.getTabHost(); TabSpec tab1 = tabHost.newTabSpec("tab1").setIndicator("tab1").setContent(R.id.tab1);
tabHost.addTab(tab1);
// 以上代码等价于
tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("tab2").setContent(R.id.tab2));
tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("tab3").setContent(R.id.tab3)); tabHost.setOnTabChangedListener(new OnTabChangeListener()
{
@Override
public void onTabChanged(String tabId)
{
if (tabId.equals("tab1"))
{ // 第一个标签
Toast.makeText(MainActivity.this, "选择了001", 3000).show();
}
if (tabId.equals("tab2"))
{ // 第二个标签
Toast.makeText(MainActivity.this, "选择了002", 3000).show();
}
if (tabId.equals("tab3"))
{ // 第三个标签
Toast.makeText(MainActivity.this, "选择了003", 3000).show();
}
}
});
}
}
第二种处理方式:
public class IndexActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.index); Spinner spinner = (Spinner) this.findViewById(R.id.spcontent);
spinner.setOnItemSelectedListener(new SpinnerSelectLintener()); } private class SpinnerSelectLintener implements OnItemSelectedListener
{
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id)
{
String[] books = getResources().getStringArray(R.array.books);
String value = "选择了:" + books[position];
Toast.makeText(IndexActivity.this, value, 3000).show();
} @Override
public void onNothingSelected(AdapterView<?> parent)
{
}
}
在基于事件监听的处理模型中,事件监听器必须实现事件监听器接口,android为不同的界面组件提供了不同的监听器接口,这些接口通常已内部类的形式存在。
所谓事件监听器,就是实现了特定接口的java类的实例,程序中实现事件监听器,通常有如下几种方式:
1.内部类方式,将事件监听器类定义成当前类的内部类;
2.外部类方式,将事件监听器类定义成一个外部类;
3.Activity本身作为事件监听器类,让Activity本身实现监听器接口,并实现事件处理方法
4.匿名内部类形式,使用匿名内部类创建事件监听器对象。
回调机制与监听机制
如果说监听机制是一种委派式的处理机制,那么回调机制则恰好相反:对于基于回调机制模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。
当用户在GUI组件上激发某个事件时,组件自己特定的方法将负责处理该事件。
为了使用回调机制类处理GUI组件上所发生的事情,我们需要为该组件提供对应的事件处理方法——java又是一种静态语音,我们无法为某个对象动态地添加方法,因此只能继承GUI组件类,并重写该类的事件处理方法来实现。
为了实现回调机制的事件处理机制,android为所有GUI组件提供了一些事件处理方法....
总结:对于基于监听的事件处理模型来说,事件源和事件监听器是分离的,当事件源上发生特定事件之后,该事件交给事件监听器负责处理;
对于基于回调事件处理模型来说,事件源和事件监听器是统一的,当事件源发生特定事件后,该事件还是由事件源本身负责处理。
Configuration类简介
Configuration类专门用于描述手机设备上的配置信息,这些配置信息既包括用户特定的配置项,也包括系统的动态设备配置。
程序可调用Activity的如下方法来获取系统的Configuration对象:
Configuration cfg = getResources().getConfiguration();
Configuration对象提供了如下常用属性来获取系统的配置信息:
| public float fontScale | 获取当前用户设置的字体的缩放因子 |
| public int keyboard |
获取当前设备所关联的键盘类型。该属性可能返回如下值:KEYBOARD_NOKEYS、KEYBOARD_QWERTY(普通电脑键盘)、 KEYBOARD_12KEY(只有12个键的小键盘) |
| public int keyboardHidden |
该属性返回一个boolean值用于标识当前键盘是否可用。该属性不仅会判断系统的硬件键盘,也会判断系统的软键盘(位于屏幕上)。如果 该系统的应键盘不可用,但软键盘可用,该属性也会返回KEYBOARDHIDDEN_NO;只有两个键盘都不可用时才返回KEYBOARDHIDDEN_YES. |
| public Locale locale | 获取用户当前的Locale |
| public int mcc | 获取移动信号的国家码 |
| public int mnc | 获取移动信号的网络码 |
| public int navigation | 判断系统上方向导航设备的类型,该属性可能返回:NAVIGATION_NONAN(无导航)、NAVAGATION_DPAD(DPAD导航)、 NAVIGATION_TRACKBALL(球轨迹导航)、NAVIGATION_WHEEL(滚轮导航)... |
| public int orientation | 获取系统屏幕的方向,该属性可能返回类型:ORIENTATION_LANDSCAPE(横向屏幕)、ORIENTATION_PORTRALT(竖向屏幕)、 ORIENTATION_SQUARE(方形屏幕)... |
| public int touchscreen |
获取系统触摸屏的触摸方式,该属性可能的返回类型:TOUCHSCREEN_NOTOUCH(无触摸)、TOUCHSCREEN_STYLUS(触摸笔式的触摸屏幕)、 TOUCHSCREEN_FINGER(接受手指的触摸屏) |
......
重写onConfigurationChanged响应系统设置更改
注意:
如果程序需要监听系统设置的更改,则可以考虑重写Activity的onConfigurationChanged(Configuration newConfig)方法,该方法是一个基于回调的事件处理方法——当系统设置发生
更改时,该方法会被自动触发。
为了在程序中动态更改系统设置,可调用Activity的setRequestedOrientation(int)方法来修改屏幕的方向(在进行系统操作时,需要对AndroidMainfest.xml添加对应的操作权限配置)。
Eg:

Handler消息传递机制
android学习笔记24——事件处理的更多相关文章
- android学习笔记25——事件处理Handler
Handler消息传递机制 ==> android消息机制是另一种形式的“事件处理”,这种机制主要是为了解决android应用的多线程问题. ——android平台不允许Activity新启动的 ...
- Android学习笔记(24):进度条组件ProgressBar及其子类
ProgressBar作为进度条组件使用,它还派生了SeekBar(拖动条)和RatingBar(星级评分条). ProgressBar支持的XML属性: Attribute Name Related ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
- 【转】Pro Android学习笔记(三):了解Android资源(上)
在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源res ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
- Android学习笔记进阶之在图片上涂鸦(能清屏)
Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...
- android学习笔记36——使用原始XML文件
XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...
- udacity android 学习笔记: lesson 4 part b
udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...
- Android学习笔记36:使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...
随机推荐
- Linux下常用压缩格式的压缩与解压方法
.tar 解包: tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) --------------------- ...
- Phonegap开发的前后台数据交互
在用Phonegap开发时,需要进行前后台数据交互,在网上找资料,很多东西让人一头雾水,最后借鉴了下面的博客: http://blog.sina.com.cn/s/blog_681929ae01017 ...
- 如何让Android字体自适应屏幕分辨率
在不同的分辨率下,Android字体大小怎么自适应分辨率的变化? 假设需要适应320x240,480x320分辨率.在res目录下新建文件夹values-320x240, values-480x320 ...
- MACOS,LINUX,IOS上可用的毫秒级精度时间获取
二话不说,先上代码 void outputCurrentTime(uint32_t seq,const char* type){ struct timeval t_curr; gettimeofday ...
- C++ Primer :第十章 :泛型算法之再探迭代器以及其他算法
除了为每个容器定义的迭代器之外,标准库在头文件<iterator>还定义了额外集中迭代器, 包括: 插入迭代器,这些迭代器被绑定到一个容器上,可以向容器插入元素. 流迭代器, 这些迭 ...
- Apache使用mod_deflate模块压缩页面优化传输速度
可以写为一行,也可以写多行,默认为gzip SetOutputFilter DEFLATE # Restrict compression to these MIME types AddOutputFi ...
- Java——日期格式
/* * 日期对象和毫秒值之间的转换. * * 毫秒值--->日期对象: * 1.通过Date对象的构造方法new Date(timeMillis) * 2.还可以通过setTime设 ...
- ABBYY FineReader的快速任务功能如何用
在使用ABBYY FineReader Pro for Mac OCR文字识别软件处理文档时,经常会执行一系列相同的步骤,如扫描.识别.将已识别文本导出为特定格式或导出至特定应用程序.针对经常执行的任 ...
- linux工具类之硬盘检测
软raidmount /dev/md0 /opt [root@localhost root]# cp /usr/share/doc/raidtools-1.00.3/ra ...
- REG_SZ和REG_EXPAND_SZ的区别
REG_SZ类型的键值中存在的可扩展占位符%xxx%不会被系统解释: REG_EXPAND_SZ类型的键值中存在的%xxx%的部分会被系统解释.