事件处理

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——事件处理的更多相关文章

  1. android学习笔记25——事件处理Handler

    Handler消息传递机制 ==> android消息机制是另一种形式的“事件处理”,这种机制主要是为了解决android应用的多线程问题. ——android平台不允许Activity新启动的 ...

  2. Android学习笔记(24):进度条组件ProgressBar及其子类

    ProgressBar作为进度条组件使用,它还派生了SeekBar(拖动条)和RatingBar(星级评分条). ProgressBar支持的XML属性: Attribute Name Related ...

  3. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  4. 【转】Pro Android学习笔记(三):了解Android资源(上)

    在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源res ...

  5. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  6. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  7. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

  8. udacity android 学习笔记: lesson 4 part b

    udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

  9. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

随机推荐

  1. Linux下软件包的多种安装方式

    源码包安装 在Linux下的很多软件都是通过源码包方式发布的,虽然相对于二进制软件包,配置和编译起来繁琐点,但是它的可移植性却好得多,针对不同的体系结构,软件开发者往往仅需发布同一份源码包,不同的最终 ...

  2. Js的引用赋值与传值赋值

    要说js的赋值方式时首先要说明js的数值类型:基本类型和引用类型. 1.基本类型 基本的数据类型有:undefined,boolean,number,string,null. 基本类型存放在栈区,访问 ...

  3. 常用的phpstorm设置

    1.始终在项目编辑器中显示行号[Show line numbers],可以通过File->Setting->Editor->Appearance->Show line numb ...

  4. html5中新的标准属性

    属性                                        值                                  描述accesskey             ...

  5. IOS中使用手机号注册

    #import <Foundation/Foundation.h>#import <UIKit/UIKit.h>@interface KCVVerify : NSObject ...

  6. const 常引用

    常类型是指使用类型修饰符 const 说明的类型,常类型的变量或对象的值是不能被更新的. 这篇主要说常引用.常引用是指所引用的对象不能被更新. 在实际应用中,常引用往往用来作为函数的形参,这样的参数称 ...

  7. ES

    https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-service-win.html https://www.e ...

  8. Microservice Orleans

    https://azure.microsoft.com/en-us/blog/containers-docker-windows-and-trends/ https://channel9.msdn.c ...

  9. Unity资源管理与更新

    当你在 工程目录下的 Asset 文件夹中放置一个文件时(电脑上的文件夹,不是 Unity 界面中的文件夹),Unity会自动检测到一个新的文件被添加(Unity会不停地检查Assets文件夹中的内容 ...

  10. Unix 入门

    说明:转自以为大神的笔记. 首先,我们一起看看UNIX的目录,因为清楚了目录,才能对UNIX的框架有个大概的印象!当然这里讲的是系统正常运转所必须的,并且一定不能删除或者修改.  / 是系统的根目录: ...