📜  Android-事件处理

📅  最后修改于: 2021-01-05 04:56:21             🧑  作者: Mango


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

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

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

  • 事件侦听器注册-事件注册是通过事件处理程序向事件侦听器进行注册的过程,以便在事件侦听器触发事件时调用该处理程序。

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

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

Event Handler Event Listener & Description
onClick()

OnClickListener()

This is called when the user either clicks or touches or focuses upon any widget like button, text, image etc. You will use onClick() event handler to handle such event.

onLongClick()

OnLongClickListener()

This is called when the user either clicks or touches or focuses upon any widget like button, text, image etc. for one or more seconds. You will use onLongClick() event handler to handle such event.

onFocusChange()

OnFocusChangeListener()

This is called when the widget looses its focus ie. user goes away from the view item. You will use onFocusChange() event handler to handle such event.

onKey()

OnFocusChangeListener()

This is called when the user is focused on the item and presses or releases a hardware key on the device. You will use onKey() event handler to handle such event.

onTouch()

OnTouchListener()

This is called when the user presses the key, releases the key, or any movement gesture on the screen. You will use onTouch() event handler to handle such event.

onMenuItemClick()

OnMenuItemClickListener()

This is called when the user selects a menu item. You will use onMenuItemClick() event handler to handle such event.

onCreateContextMenu()

onCreateContextMenuItemListener()

This is called when the context menu is being built(as the result of a sustained “long click)

作为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的私有数据。无需引用即可调用“活动”。

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

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

Step Description
1 You will use Android studio IDE to create an Android application and name it as myapplication under a package com.example.myapplication as explained in the Hello World Example chapter.
2 Modify src/MainActivity.java file to add click event listeners and handlers for the two buttons defined.
3 Modify the detault content of res/layout/activity_main.xml file to include Android UI controls.
4 No need to declare default string constants.Android studio takes care default constants.
5 Run the application to launch Android emulator and verify the result of the changes done in the aplication.

以下是修改后的主要活动文件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文件的内容-

这里abc表示关于tutorialspoint徽标



   
   
      
   
      
   
      
   
      
   
      
   
      

下面将RES /值的内容/字符串.XML定义两个新常量-



   myapplication

以下是AndroidManifest.xml的默认内容-



      
   
      
      
      
         
            
            
         
      
      
      
   

让我们尝试运行您的myapplication应用程序。我假设您在进行环境设置时已创建了AVD 。要从Android Studio运行该应用,请打开您项目的活动文件之一,然后点击运行Eclipse运行图标工具栏中的图标。 Android Studio将应用程序安装在您的AVD上并启动它,如果设置和应用程序一切正常,它将显示在“模拟器”窗口下面-

Android事件处理

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

行使

我建议尝试为不同的事件类型编写不同的事件处理程序,并了解不同事件类型及其处理方式的确切区别。与菜单,微调器,选择器小部件有关的事件几乎没有什么不同,但它们也基于与上述相同的概念。