Android事件处理


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

以下三个与Android事件管理相关的概念 -

  • 事件监听器 - 事件监听器是View类中包含单个回调方法的接口。 当用户与UI中的项目交互触发了已注册侦听器的View时,Android框架将调用这些方法。

  • 事件监听器注册 - 事件注册是事件处理程序向 事件监听器注册 的过程,以便在事件监听器触发事件​​时调用处理程序。

  • 事件处理程序 - 当事件发生并且我们为事件注册了事件侦听器时,事件侦听器会调用事件处理程序,这是实际处理事件的方法。

事件监听器和事件处理程序

事件处理程序 事件监听器和描述
onClick()

OnClickListener()

当用户点击或触摸或关注任何小部件(如按钮,文本,图像等)时,将调用此方法。您将使用onClick()事件处理程序来处理此类事件。

onLongClick()

OnLongClickListener()

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

onFocusChange()

OnFocusChangeListener()

当小部件失去焦点时调用它。用户离开视图项目。您将使用onFocusChange()事件处理程序来处理此类事件。

onKey()()

OnFocusChangeListener()

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

onTouch()

OnTouchListener()

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

onMenuItemClick()

OnMenuItemClickListener()

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

onCreateContextMenu()

onCreateContextMenuItemListener()

在构建上下文菜单时调用此方法(作为持续“长按”的结果)

还有许多事件侦听器可用作 View 类的一部分,如OnHoverListener,OnDragListener等,您的应用程序可能需要它们。因此,我建议您参考Android应用程序开发的官方文档,以便您开发复杂的应用程序。

活动听众注册

事件注册是事件处理程序向事件侦听器注册的过程,以便在事件侦听器触发事件​​时调用处理程序。虽然有几种棘手的方法可以为任何事件注册你的事件监听器,但我只会列出前三种方式,你可以根据情况使用它们中的任何一种。

  • 使用匿名内部类

  • Activity类实现Listener接口。

  • 使用布局文件activity_main.xml直接指定事件处理程序。

以下部分将为您提供有关所有三种方案的详细示例 -

触摸模式

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

焦点

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

  • isFocusable() - 返回true或false

  • 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) ;
}

事件处理示例

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

在这里,您将创建一个侦听器的匿名实现,如果每个类仅应用于单个控件并且您有利于将参数传递给事件处理程序,那么它将非常有用。在此方法中,事件处理程序方法可以访问Activity的私有数据。调用Activity不需要引用。

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

以下是显示我们如何使用单独的Listener类来注册和捕获click事件的简单步骤。类似地,您可以为任何其他所需的事件类型实现侦听器。

Step Description
1 您将使用Android studio IDE创建一个Android应用程序,并com.example.myapplication包下将其命名为myapplicationHello World示例章节中所述。
2 修改src / MainActivity.java文件,为定义的两个按钮添加click事件监听器和处理程序。
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运行应用程序,请打开项目的某个活动文件,然后单击Eclipse运行图标工具栏中的“运行” 图标。Android Studio在您的AVD上安装应用程序并启动它,如果您的设置和应用程序一切正常,它将显示以下模拟器窗口

Android事件处理

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

行使

我建议尝试为不同的事件类型编写不同的事件处理程序,并了解不同事件类型及其处理的确切差异。与菜单,微调器,拾取器小部件相关的事件稍有不同,但它们也基于与上述相同的概念。