Android(安卓)事件处理

事件是收集有关用户与应用程序的交互组件交互的数据的有用方法。比如按下按钮或触摸屏幕等。Android 框架以先进先出(FIFO)的方式维护事件队列。您可以在程序中捕获这些事件,并根据要求采取适当的行动。

以下 3 个概念与 Android 事件管理相关:

  • 事件监听:事件侦听器是 View 类中包含单个回调方法的接口。当用户与 UI 中的项目交互触发侦听器注册到的视图时,Android 框架将调用这些方法。
  • 事件监听器注册:事件注册是事件处理程序向事件侦听器注册的过程,以便在事件侦听器触发事件时调用该处理程序。
  • 事件处理:当一个事件发生并且我们已经为该事件注册了一个事件监听器时,事件监听者会调用事件处理程序,这是实际处理事件的方法。

事件监听 & 事件处理

事件处理事件监听 & 描述
onClick()

OnClickListener()

当用户单击或触摸或聚焦于任何小部件(如按钮、文本、图像等)时,就会调用此函数您将使用 onClick() 事件处理程序来处理此类事件。

onLongClick()

OnLongClickListener()

当用户单击或触摸或聚焦于任何小部件(如按钮、文本、图像等)时,就会调用此函数持续一秒或多秒您将使用 onLongClick() 事件处理程序来处理此类事件。

onFocusChange()

OnFocusChangeListener()

这是在小部件失去焦点时调用的,即用户离开视图项您将使用 onFocusChange() 事件处理程序来处理此类事件。

onKey()

OnFocusChangeListener()

当用户专注于该项目并按下或释放设备上的硬件键时,就会调用此功能您将使用 onKey() 事件处理程序来处理此类事件。

onTouch()

OnTouchListener()

当用户按下键、释放键或屏幕上的任何移动手势时,将调用此功能您将使用 onTouch() 事件处理程序来处理此类事件。

onMenuItemClick()

OnMenuItemClickListener()

当用户选择菜单项时,将调用此函数您将使用 onMenuItemClick() 事件处理程序来处理此类事件。

onCreateContextMenu()

onCreateContextMenuItemListener()

这是在构建上下文菜单时调用的(作为长点击的结果)。

作为 View 类的一部分,可以使用更多的事件监听器,如 OnHoverListenerOnDragListener 等,这可能是您的应用程序所需要的。因此,我建议参考 Android 应用程序开发的官方文档,以防您要开发复杂的应用程序。


事件监听器注册

事件注册是事件处理程序向事件监听器注册的过程,以便在事件监听器触发事件时调用该处理程序。尽管有几种棘手的方法可以为任何事件注册事件监听器,但我只列出前 3 种方法,您可以根据情况使用其中任何一种。

  • 使用匿名内部类
  • Activity 类实现 Listener 接口。
  • 使用布局文件 activity_main.xml 直接指定事件处理程序。

以下部分将为您提供所有 3 种场景的详细实例:


触摸模式

用户可以通过使用硬件键或按钮或触摸屏幕与设备交互。触摸屏幕可使设备进入触摸模式。然后,用户可以通过触摸屏幕上的虚拟按钮、图像等与设备交互。您可以通过调用 View 类的 isInTouchMode() 方法来检查设备是否处于触摸模式。


聚焦

视图或小部件通常会突出显示或在焦点时显示闪烁的光标。这表明它已准备好接受用户的输入。

  • isFocusable():返回 truefalse
  • isFocusableInTouchMode():检查视图在触摸模式下是否可聚焦。(当使用硬件键时,视图可能可聚焦,但当设备处于触摸模式时,视图不可聚焦)
  1. android:foucsUp="@=id/button_l"

onTouchEvent()

  1. public boolean onTouchEvent(motionEvent event){
  2. switch(event.getAction()){
  3. case TOUCH_DOWN:
  4. Toast.makeText(this,"you have clicked down Touch button",Toast.LENTH_LONG).show();
  5. break();
  6. case TOUCH_UP:
  7. Toast.makeText(this,"you have clicked up touch button",Toast.LENTH_LONG).show();
  8. break;
  9. case TOUCH_MOVE:
  10. Toast.makeText(this,"you have clicked move touch button"Toast.LENTH_LONG).show();
  11. break;
  12. }
  13. return super.onTouchEvent(event) ;
  14. }

事件处理实例

使用匿名内部类注册事件监听器

在这里,您将创建监听器的匿名实现,如果每个类仅应用于单个控件,并且您有优势将参数传递给事件处理程序,那么将非常有用。在这种方法中,事件处理程序方法可以访问 Activity 活动的私有数据。无需引用即可调用活动。

但是,如果将处理程序应用于多个控件,则必须剪切并粘贴处理程序的代码,如果处理程序代码很长,则代码更难维护。

以下是简单的步骤,说明我们将如何使用单独的 Listener 类来注册和捕获单击事件。类似的方式,您可以为任何其他必需的事件类型实现监听器。

步骤描述
1您将使用 Android studio IDE 创建一个 Android 应用程序,并将其命名为 com.example.myapplication 包下的 myapplication,如 Hello World 实例一章所述。
2修改 src/MainActivity.java 为定义的两个按钮添加单击事件监听器和处理程序的文件。
3修改 res/layout/activity_main.xml 内容包含 Android UI 控件。
4无需声明默认字符串常量 Android Studio 负责默认常量。
5运行应用程序以启动 Android 模拟器并验证应用程序中所做更改的结果。

以下是修改后的主活动文件 src/com.example.myapplication/MainActivity.java 的内容。该文件可以包括每个基本生命周期方法。

  1. package com.example.myapplication;
  2. import android.app.ProgressDialog;
  3. import android.os.Bundle;
  4. import android.support.v7.app.ActionBarActivity;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.TextView;
  8. public class MainActivity extends ActionBarActivity {
  9. private ProgressDialog progress;
  10. Button b1,b2;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. progress = new ProgressDialog(this);
  16. b1=(Button)findViewById(R.id.button);
  17. b2=(Button)findViewById(R.id.button2);
  18. b1.setOnClickListener(new View.OnClickListener() {
  19. @Override
  20. public void onClick(View v) {
  21. TextView txtView = (TextView) findViewById(R.id.textView);
  22. txtView.setTextSize(25);
  23. }
  24. });
  25. b2.setOnClickListener(new View.OnClickListener() {
  26. @Override
  27. public void onClick(View v) {
  28. TextView txtView = (TextView) findViewById(R.id.textView);
  29. txtView.setTextSize(55);
  30. }
  31. });
  32. }
  33. }

下面是 res/layout/activity_main.xml 的内容

abc 表示 logo

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:paddingBottom="@dimen/activity_vertical_margin"
  8. android:paddingLeft="@dimen/activity_horizontal_margin"
  9. android:paddingRight="@dimen/activity_horizontal_margin"
  10. android:paddingTop="@dimen/activity_vertical_margin"
  11. tools:context=".MainActivity">
  12. <TextView
  13. android:id="@+id/textView1"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="Event Handling "
  17. android:layout_alignParentTop="true"
  18. android:layout_centerHorizontal="true"
  19. android:textSize="30dp"/>
  20. <TextView
  21. android:id="@+id/textView2"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:text="Tutorials point "
  25. android:textColor="#ff87ff09"
  26. android:textSize="30dp"
  27. android:layout_above="@+id/imageButton"
  28. android:layout_centerHorizontal="true"
  29. android:layout_marginBottom="40dp" />
  30. <ImageButton
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:id="@+id/imageButton"
  34. android:src="@drawable/abc"
  35. android:layout_centerVertical="true"
  36. android:layout_centerHorizontal="true" />
  37. <Button
  38. android:layout_width="wrap_content"
  39. android:layout_height="wrap_content"
  40. android:text="Small font"
  41. android:id="@+id/button"
  42. android:layout_below="@+id/imageButton"
  43. android:layout_centerHorizontal="true" />
  44. <Button
  45. android:layout_width="wrap_content"
  46. android:layout_height="wrap_content"
  47. android:text="Large Font"
  48. android:id="@+id/button2"
  49. android:layout_below="@+id/button"
  50. android:layout_alignRight="@+id/button"
  51. android:layout_alignEnd="@+id/button" />
  52. <TextView
  53. android:layout_width="wrap_content"
  54. android:layout_height="wrap_content"
  55. android:text="Hello World!"
  56. android:id="@+id/textView"
  57. android:layout_below="@+id/button2"
  58. android:layout_centerHorizontal="true"
  59. android:textSize="25dp" />
  60. </RelativeLayout>

下面是 res/values/strings.xml 内容定义常量:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string name="app_name">myapplication</string>
  4. </resources>

下面是 AndroidManifest.xml 的内容:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.myapplication" >
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@drawable/ic_launcher"
  7. android:label="@string/app_name"
  8. android:theme="@style/AppTheme" >
  9. <activity
  10. android:name="com.example.myapplication.MainActivity"
  11. android:label="@string/app_name" >
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN" />
  14. <category android:name="android.intent.category.LAUNCHER" />
  15. </intent-filter>
  16. </activity>
  17. </application>
  18. </manifest>

让我们尝试运行 MyApplication 应用程序。我假设您在进行环境设置时创建了 AVD。要从 Android Studio 运行应用程序,请打开项目的 activity 文件之一,然后单击工具栏上的运行 Eclipse Eclipse Run Icon 图标。Android studio 在您的 AVD 上安装应用程序并启动它,如果您的设置和应用程序一切正常,它将显示以下模拟器窗口:

现在,您尝试逐个单击两个按钮,您会看到 Hello World 文本的字体将发生变化,这是因为注册的单击事件处理程序方法正在针对每个单击事件调用。


练习

建议尝试为不同的事件类型编写不同的事件处理程序,并了解不同事件类型及其处理的确切差异。与菜单、微调器、选择器小部件相关的事件差别不大,但它们也基于与上面解释的相同的概念。