事件处理
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消息传递机制