Android - 概述

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不需要引用.

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

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

Step描述
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工作室负责默认常量.
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 文件的内容&减号;

这里abc表示关于it1352徽标
<?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 Run Icon icon从工具栏中. Android Studio在您的AVD上安装应用程序并启动它,如果您的设置和应用程序一切正常,它将显示以下模拟器窗口 :

Android事件处理

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

练习

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