Android 简明教程
Android - Event Handling
有以下三个概念与Android事件管理相关:
-
Event Listeners - 事件监听器是View类中的一个接口,包含一个唯一的回调方法。当与监听器注册的View由用户的UI交互项目触发时,这些方法将被Android框架调用。
-
事件监听器注册 - 事件注册是事件处理程序与事件监听器注册的过程,以便当事件监听器触发事件时调用处理程序。
-
Event Handlers - 当事件发生且我们已为事件注册了事件监听器时,事件监听器将调用事件处理程序,该处理程序是实际处理事件的方法。
Event Listeners & Event Handlers
Event Handler |
Event Listener & Description |
onClick() |
OnClickListener() 当用户单击、触摸或关注任何小部件(如按钮、文本、图像等)时调用此方法。您将使用onClick()事件处理程序来处理此类事件。 |
onLongClick() |
OnLongClickListener() 当用户连续一秒或更长时间单击、触摸或关注任何小部件(如按钮、文本、图像等)时调用此方法。您将使用onLongClick()事件处理程序来处理此类事件。 |
onFocusChange() |
OnFocusChangeListener() 当小部件失去焦点时调用此方法,即用户离开视图项目时。您将使用onFocusChange()事件处理程序来处理此类事件。 |
onKey() |
OnFocusChangeListener() 当用户关注项目并在设备上按下或释放硬件键时调用此方法。您将使用onKey()事件处理程序来处理此类事件。 |
onTouch() |
OnTouchListener() 当用户按下按键、释放按键或在屏幕上执行任何动作手势时调用此方法。您将使用onTouch()事件处理程序来处理此类事件。 |
onMenuItemClick() |
OnMenuItemClickListener() 当用户选择菜单项时调用此方法。您将使用onMenuItemClick()事件处理程序来处理此类事件。 |
onCreateContextMenu() |
onCreateContextMenuItemListener() 在构建上下文菜单时调用此方法(作为持续“长按”的结果)。 |
作为 View 类的部分,还有许多其他事件监听器可用,例如OnHoverListener、OnDragListener等,您的应用程序可能需要它们。因此,如果您打算开发复杂应用程序,我建议参考Android应用程序开发的官方文档。
Event Listeners Registration
事件注册是事件处理程序与事件监听器注册的过程,以便当事件监听器触发事件时调用处理程序。虽然有几种棘手的方法可以为任何事件注册您的事件监听器,但我将只列出前三个方式,您可以根据情况使用其中任何一个方式。
-
使用匿名内部类。
-
Activity类实现监听器接口。
-
使用布局文件activity_main.xml直接指定事件处理程序。
以下章节将为您提供所有这三种场景的详细示例。
Touch Mode
用户可以通过使用硬件键或者按钮或触摸屏幕来与他们的设备进行交互。触摸屏幕将会使设备进入到触摸模式。随后,用户可以通过触摸屏幕上的虚拟按钮、图像等与屏幕上的虚拟按钮、图像等进行交互。您可以通过调用 View 类的 isInTouchMode() 方法来检查设备是否处于触摸模式。
Focus
视图或者窗口小部件通常会在其获取焦点时突出显示或者显示一个闪烁光标。这表示现在准备接受用户的输入。
-
isFocusable() − 返回 true 或者 fales
-
isFocusableInTouchMode() − 检查是否视图在触摸模式下可获取焦点(使用键盘硬件时视图可能是可以获取焦点的,但是当设备处于触摸模式下时不能获取焦点)。
android:foucsUp="@=id/button_l"
onTouchEvent()
public boolean onTouchEvent(motionEvent event){
switch(event.getAction()){
case TOUCH_DOWN:
Toast.makeText(this,"you have clicked down Touch button",Toast.LENTH_LONG).show();
break();
case TOUCH_UP:
Toast.makeText(this,"you have clicked up touch button",Toast.LENTH_LONG).show();
break;
case TOUCH_MOVE:
Toast.makeText(this,"you have clicked move touch button"Toast.LENTH_LONG).show();
break;
}
return super.onTouchEvent(event) ;
}
Event Handling Examples
Event Listeners Registration Using an Anonymous Inner Class
您将在本文中创建一个侦听器的匿名实现,并且当每个类仅应用于一个控件时才会有用,您能够向事件处理器传递参数。在这种方法中,事件处理器方法可以访问 Activity 的私有数据。无需引用即可调用 Activity。
但是,如果您将处理器应用于多个控件,您将不得不剪切和粘贴处理器的代码,并且如果处理器的代码很长,则会使得代码更难于维护。
以下是如何使用单独的侦听器类来注册并捕捉点击事件的简单步骤。同理,您可以针对任何其他所需的事件类型来实现您的监听器。
Step |
Description |
1 |
您将使用 Android Studio IDE 来创建一个 Android 应用程序并将其命名为 myapplication,放到一个名为 com.example.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 。该文件可以包括每个基本生命周期方法。
package com.example.myapplication;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
private ProgressDialog progress;
Button b1,b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progress = new ProgressDialog(this);
b1=(Button)findViewById(R.id.button);
b2=(Button)findViewById(R.id.button2);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView txtView = (TextView) findViewById(R.id.textView);
txtView.setTextSize(25);
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView txtView = (TextView) findViewById(R.id.textView);
txtView.setTextSize(55);
}
});
}
}
以下是 res/layout/activity_main.xml 文件的内容——
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Event Handling "
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp"/>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small font"
android:id="@+id/button"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Font"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignRight="@+id/button"
android:layout_alignEnd="@+id/button" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/textView"
android:layout_below="@+id/button2"
android:layout_centerHorizontal="true"
android:textSize="25dp" />
</RelativeLayout>
以下是 res/values/strings.xml 的内容,用于定义两个新常量——
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">myapplication</string>
</resources>
以下是 AndroidManifest.xml 的默认内容−
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.myapplication.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
让我们尝试运行您的 myapplication 应用程序。我假设您在进行环境设置的时候创建了您的 AVD 。要从 Android Studio 运行该应用程序,请打开您的一个项目活动文件,然后从工具栏中点击运行图标。Android Studio 会将该应用程序安装到您的 AVD 上并启动它,如果您的设置和应用程序没有问题,它将显示以下模拟器窗口 −
现在我们尝试一个一个地点击两个按钮,您将看到 Hello World 文本的字体会发生改变,这是因为针对每个点击事件已调用注册的点击事件处理器方法。