編輯:關於Android編程
事件處理是Android編程中非常重要的一個部分,因為Android應用在運行過程中會產生許多各種各樣的事件(動作),應用必須為這些動作執行對應的響應代碼;將產生的動作和響應聯系起來的方式就是事件處理機制。Android平台提供了兩種事件處理機制,分別是基於監聽的模式和基於回調的模式。
事件源:事件發生的地方,比如某個按鈕、文本框等 事件:事件類型,通過Event對象表達 事件監聽器:負責監聽某種的事件類型,並執行相應的操作
基於監聽的事件處理模型首先需要創建一個事件監聽器,該事件監聽器可以監聽某一類型的事件;然後,把事件監聽器注冊到某個組件中;當該組件上發生了可以被該監聽器監聽的動作後,組件會產生一個代表該動作的Event對象,並把Event對象傳遞給監聽器。在Android中,生成Event對象以及Event對象的傳遞不需要程序員介入,系統會自動去處理這一步操作。程序員需要做的就是指定事件源,並在該事件源上注冊對應於某個事件類型的事件監聽器,並重寫相應的處理代碼。
xml布局代碼
Java代碼
public class MainActivity extends Activity {
private Button mClickBtn;
// 創建監聽器,監聽“點擊”事件
final View.OnClickListener listener =
new View.OnClickListener() {
@Override
public void onClick(View v) {
L.d("You click btn_click!");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mClickBtn = (Button) findViewById(R.id.btn_click);
// 為mClickBtn組件設置事件類型為‘點擊’的監聽器
mClickBtn.setOnClickListener(listener);
}
}
上述代碼在MainActivity中創建了一個監聽器listener,該監聽器負責監聽“點擊”事件,然後在onCreate方法中通過setOnClickListener方法將該監聽器注冊到mClickBtn上。
在上述代碼中,監聽器通過匿名內部類實現,並創建了一個該匿名內部類的對象,然後將該對象注冊到事件源上,這種方式與直接在設置監聽器的位置新建監聽器(如下所示)相比,好處在於該監聽器對象可以重用。
mClickBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
L.d("You click btn_click!");
}
});
注意
一般監聽器都通過內部類實現,因為內部類可以訪問到外部類中包含的組件或字段,而一般監聽器都會涉及到對外部類中相關組件或字段的操作。如果通過外部類實現,還需要傳遞本類的引用,而且代碼也不是很直觀。 一般在監聽器中不實現業務邏輯,如果監聽器確實需要處理邏輯,可以把邏輯封裝在外部類的方法中,然後在監聽器中調用該方法(監聽器只負責簡單的數據展示或數據傳遞,邏輯處理通過專門的方法實現,這種編碼方式更符合面向對象的設計原則)
上面所說的基於監聽的處理方式是一種委托的事件處理方式,即將事件處理委托給專門負責處理事件的監聽器;而接下來要討論的基於回調的處理方式則是一種主動式的事件處理方式,即事件由事件源本身處理。從代碼實現上來說,要添加事件處理的組件需要實現特定的接口,並重寫接口中的某些方法;當對應的事件發生時,系統會回調該組件中被重寫的方法。舉個例子
XML布局代碼
Java代碼
// 自定義MyButton類
public class MyButton extends Button {
public MyButton(Context context, AttributeSet set) {
super(context, set);
}
// 設置回調函數
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
Log.i("MyButton", "MyButton onKeyDown");
return false;
}
}
public class MainActivity extends Activity {
private Button mClickBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mClickBtn = (Button) findViewById(R.id.btn_click);
// 設置監聽器
mClickBtn.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
Log.i("mClickBtn", "onKeyListener");
return false;
}
});
}
// 設置Activity回調函數
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
Log.i("MainActivity", "MainActivity onKeyDown");
return false;
}
}
運行上述代碼後,在logcat中會打印:
onKeyListener
MyButton onKeyDown
MainActivity onKeyDown
也就是說,事件發生後被調用的先後順序是:監聽器 –> 組件的回調函數;當組件回調函數返回的值為false時,事件會繼續向上傳播,所以會繼續調用Acitivity中的回調函數;如果監聽器中的onKey方法返回true,則不會調用組件的回調函數。
一、Ant 打包:(下載ant、配置環境變量就不說了) 1、進入命令行模式,並切換到項目目錄,執行如下命令為ADT創建的項目添加ant build支持: andro
百度專車車型收費是怎樣的?百度專車強勢來臨,在目前國內專車市場裡,多一個競爭對手必然帶來新一輪的專車優惠。那麼很多人都關心百度專車有哪些車型,收費分別是多少
本系列博文我想圍繞在Android中的一些優化細節和大家進行分享。Android中的優化可謂又是一重任,Android不足以像PC端具有很高的內存執行空間給我們用來重量級
本文實例為大家分享了Android使用入門第二十七篇點贊動畫的具體代碼,供大家參考,具體內容如下MainActivity.java代碼:package siso.like