安卓中的事件机制

本文的主要目的是对Android应用程序中事件处理机制进行一个简单的介绍。

Android Events

Android中的事件可以采用各种不同的形式,但通常是为了响应外部操作而生成的。最常见的事件形式,特别是平板电脑和智能手机等设备,通常涉及与触摸屏的某种形式的互动,而这些事件都属于输入事件的类别。
Android框架维护一个事件队列,事件在它们发生时放置到其中。然后在先入先出(FIFO)的基础上从队列中删除事件。在诸如触摸屏幕的输入事件的情况下,事件被传递到位于触摸发生的屏幕上的位置处的视图。除了事件通知之外,该视图还通过关于事件性质的信息范围(取决于事件类型),例如用户指尖和屏幕之间的接触点的坐标。
为了能够处理已经传递的事件,视图必须具有事件监听器。导出所有用户界面组件的Android View类包含一系列事件监听器接口,每个接口都包含一个回调方法的抽象声明。为了能够响应特定类型的事件,视图必须注册适当的事件侦听器并实现相应的回调。例如,如果按钮是响应点击事件(相当于用户触摸并释放按钮视图,就像点击物理按钮),它必须同时注册View.onClickListener事件侦听器(通过调用目标view的setOnClickListener()方法)并实现相应的onClick()回调方法。如果在按钮视图位置的屏幕上检测到“点击”事件,则当从事件队列中删除该事件时,Android框架将调用该视图的onClick()方法。当然,在执行任何应该执行的任务的onClick()回调方法的实现中,或者响应于按钮点击而调用的其他方法。

Event Listeners and Callback Methods

Android框架中提供的事件侦听器以及与每个事件相关联的回调方法包括:

  • onClickListener - 用于检测用户触摸的点击风格事件,然后释放视图占用的设备显示区域。对应于onClick()回调方法,该方法将接收事件的视图的引用传递给参数。
  • onLongClickListener - 用于检测用户在一段时间内保持对视图的触摸。对应于传递接收事件的视图作为参数的onLongClick()回调方法。
  • onTouchListener - 用于检测与触摸屏的任何形式的联系,包括单个或多个触摸和手势动作。对应于onTouch()回调,本主题将在题为Android Touch和Multi-touch Event Handling的章节中有更详细的介绍。回调方法将接收事件的视图和MotionEvent对象作为参数传递。
  • onCreateContextMenuListener - 通过长时间单击来监听创建上下文菜单。对应于onCreateContextMenu()回调方法。回调通过菜单,接收事件的视图和菜单上下文对象。
  • onFocusChangeListener - 当跟踪球或导航键的交互结果时,焦点移动离开当前视图时检测。对应于传递接收到事件的视图的onFocusChange()回调方法和一个布尔值,以指示焦点是获得还是丢失。
  • onKeyListener - 用于在视图具有焦点时检测设备上的按键何时被按下。对应于onKey()回调方法。作为参数传递的是接收到该事件的视图,被按下的物理键的KeyCode和一个KeyEvent对象。

An Example

我们用一个简单例子来说明如何使用Android中的事件机制来实现界面与用户的互动。我们将会使用事件监听器检测用户点击按钮的操作,并在回调方法中的代码更新文本视图以指示事件已被处理。

首先我们来创建一个简单的Layout:
<pre><code>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="old text"
android:layout_centerHorizontal="true"
android:layout_above="@id/button"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Press Me"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"/>
</RelativeLayout>
</code></pre>

使用Android Studio预览效果如图:


然后我们需要在MainActivity中注册相应的事件监听器,并实现回调方法。

package ss.myandroidapplication.daya;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import ss.myandroidapplication.R;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.test);

   Button btn = (Button) findViewById(R.id.testButton);
   btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
          TextView text = (TextView)findViewById(R.id.textView);
          text.setText("you clicked the button");
    }});
    }
}

当我们编译并运行我们的代码,点击按钮会发现,文本变为了监听事件中注册的内容,表明我们的代码生效啦。

总结

我们知道,如果用户界面包含的视图不会对用户交互作出任何反应,则该用户界面几乎没有实际用途。 Android通过事件侦听器和回调方法的概念,连通了用户界面和应用程序的后端代码。 Android View类定义了一组可以在视图对象上注册的事件侦听器。每个事件监听器也与它相关联一个回调方法。当事件发生在用户界面的视图中时,该事件将被放置在事件队列中,并由Android运行时在第一个进行处理。如果发生事件的视图已经注册了与事件类型匹配的侦听器,则调用相应的回调方法。然后,回调方法会在返回之前执行活动所需的任务。此外,还需要一些回调方法来返回一个布尔值,以指示事件是否需要传递给在视图上注册或被系统丢弃的任何其他事件监听器。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容