亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android 基于回調的事件處理----事件分發

發布時間:2020-06-30 13:59:47 來源:網絡 閱讀:1221 作者:poarry 欄目:移動開發

     Android事件處理機制有兩種:

     基于監聽的事件處理

     基于回調的事件處理。

     基于監聽的想必學過java或者接觸過Android的都了解,最近看了一下有關回調方面的書,今天主要是想說一下基于回調的事件處理機制。多為我自己的理解總結和借鑒別人的一些東西,有錯誤或者不理解的地方可以在評論處指出來,謝謝~

    基于回調事件處理的做法:

     重寫Android組件特定的回調方法,或者重寫activity的回調方法,Android絕大部分界面組件都提供有事件響應的回調方法,開發者只要重寫即可。一般的,基于回調的事件處理可用于具有通用型事件,它的代碼簡潔。

    一、回調機制和監聽機制

    對于基于回調事件處理模型來說事件源與事件監聽器是統一的,就是說當用戶在GUI組件上激發某個事件時,組件自己特定的方法將負責處理該事件。為了使用回調機制類處理GUI組件上發生的事件,我們需要為該組件提供對應的事件處理方式,但是java是靜態語言,我們無法為某個對象動態添加方法,只能繼承GUI組件類,然后重寫該類的事件處理方法來實現。

    為實現回調機制的事件處理,Android為所有GUI組件都提供了一些事件處理的回調方法。以View為例,該類包含如下方法:

  boolean onKeyDown(int keyCode,KeyEvent event):當用戶在該組件上按下某個按鍵時觸發該方法。

 boolean onKeyLongPress(int keyCode,KeyEvent event):當用戶在該組件上長按某個按鍵時觸發該方法。

 boolean onKeyShortcut(int keyCode,KeyEvent event):當一個鍵盤快捷鍵事件發生時觸發該方法。

 boolean onKeyup(int keyCode,KeyEvent event):當用戶在該組件上松開某個按鍵時觸發該方法。

 boolean onTouchEvent(MotionEvent event):當用戶在該組件上觸發觸摸屏時觸發該方法。

 boolean onTrackballEvent(MotionEvent  event):當用戶在該組件上軌跡球屏事件時觸發該方法。

 基于回調的事件處理機制可通過自定義View來實現,自定義View時重寫該View的事件處理方法即可。

如下例子

自定義Button類:

package com.example.testnoew;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Button;

public class MyButton extends Button{

 public MyButton(Context context, AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
 }

 @Override
 public boolean onKeyDown(int keyCode,KeyEvent event){
  
  super.onKeyDown(keyCode, event);
  Log.v("MYPROJECT", "onKeyDown in MYBUTTON");
  //返回TRUE 表明該事件不會向外擴散;
  return true;
 }
}

 

xml文件:

 

<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"
    tools:context=".MainActivity" >

    <!-- 自定義View用時使用全限定類名 -->
 <com.example.testnoew.MyButton
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="Click Me"
    
     />

</RelativeLayout>

然后再activity中調用這個xml文件就好了,接下來運行起來看你的Logcat(不會過濾logcat就自己網上去看),因為重寫的MyButton中的onKeyDown消費了點擊事件,因此不會傳播出去,也就是說按鈕會自己處理事件(當然實際開發中這個部分就是我們要自己寫東西)。


    二、基于回調的事件傳播(事件分發機制)

幾乎所有的基于回調的事件處理方法都有一個Boolean類型的返回值,該返回值用于標識該處理方法是否能完全處理該事件。

      如果處理事件的回調方法返回true,表明該處理方法已完全處理該事件(已消費掉)。該事件不會傳播出去。

    如果處理事件的回調方法返回false,表明該處理方法未完全處理該事件,該事件會傳播出去。

 

對于基于回調的事件傳播而言,某組件所發生的事情不僅能夠激發該組件的回調方法,也會觸發該組件所在的activity的回調方法(只要能夠傳播到該activity,也就是說某組件不把這個事件消費掉)。

 

 

 

主activity ,重寫onKeyDown方法,該方法會在某個按鍵被按下時被回調

public class MainActivity extends Activity {


 

 private Button testButton;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  testButton = (Button)findViewById(R.id.btn_test);
  testButton.setOnKeyListener(new OnKeyListener() {

   public boolean onKey(View Source,int kyeCode,KeyEvent event)
    {
    //只處理按下的事件
     if(event.getAction() == KeyEvent.ACTION_DOWN){
      Log.i("MYPROJECT", "in Activity Button Listener!");
     }
     //表明該事件會向外繼續傳播
     return false;
    }

  });
 }

 /*
  * (non-Javadoc)
  * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent)
  * onKeyDown方法可監聽整個activity包含的所有組件的按鍵被按下事件
  *
  */
 public boolean onKeyDown(int keyCode, KeyEvent event){
  
   super.onKeyDown(keyCode, event);
   Log.i("MYPROJECT", "in Activity");
   
  return false;
  
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }

}

 

自定義的MyButton類

 

 

package com.example.testnoew;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Button;

public class MyButton extends Button{

 public MyButton(Context context, AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
 }

 @Override
 public boolean onKeyDown(int keyCode,KeyEvent event){
  
  super.onKeyDown(keyCode, event);
  Log.v("MYPROJECT", "onKeyDown in MYBUTTON");
  //返回false 表明該事件沒有被空間本身自己處理,會向外傳播;
  return false;
 }
}

xml文件基本沒變,只是給自定義的Button添加了一個id;

通過我們看自己的logcat可以發現當該組件上某個按鍵被按下的事件發生時,Android系統會最先觸發該按鍵綁定的事件監聽器,然后觸發該組件提供的事件回調方法,然后會傳播到該組件所在的activity中。當然如果我在回調或者事件監聽中返回true,那么意味著該事件不會繼續向外傳播 。

 


    三、重寫onTouchEvent方法響應觸摸屏事件

    Android事件處理機制保證基于監聽的事件監聽器會被有限觸發。

    基于監聽的事件模式分工明確,事件源,事件監聽由兩個類分開,實現,因此可維護性好點。

    基于回調的事件處理機制一定程度上具有高內聚的特性。

具體的實例和上面的大同小異,比如, 我自定義控件,然后再自定義控件內部重寫onTouchEvent事件,在這個事件中處理比如位置、大小等變化,然后返回 true,這樣所在的activity就不會再處理它。

然后再xml中直接調用這個控件就好了。

 

 

 

 

      本人也是剛工作不到半年,然后這些東西也是看了寫書才有所理解,在這里拋磚引玉,有不對的地方歡迎來噴。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长阳| 韶关市| 德昌县| 慈溪市| 冷水江市| 邢台市| 都昌县| 汶川县| 砚山县| 安康市| 吉木萨尔县| 新巴尔虎右旗| 平舆县| 光泽县| 德钦县| 新津县| 广德县| 旬邑县| 长寿区| 泰顺县| 永善县| 化州市| 石林| 宜黄县| 漾濞| 和龙市| 小金县| 湟中县| 闻喜县| 福安市| 项城市| 黄陵县| 曲麻莱县| 东丰县| 板桥市| 芜湖市| 清徐县| 黑龙江省| 杭州市| 科技| 边坝县|