一、引言
在經過幾天的學習之后, 首先熟悉了幾大基本布局以及一些常用控件的使用方法,目前正在學習如何實現一個基本的登錄注冊界面及其功能,而實現功能就需要我們采用事件處理機制來進行調用事件處理方法。以下,就是我總結的一些事件處理機制。
二、常用監聽接口
- View.OnClickListener 單擊事件監聽器必須實現的接口
- View.OnCreateContextMenuListener 創建上下文菜單事件
- View.OnFocusChangeListener 焦點改變事件
- View.OnKeyListener 按鍵事件監聽器
- View.OnLongClickListener 長按事件監聽器
- View.OnTouchListener 觸摸屏事件監聽器
三、基於監聽的事件處理機制
(一)首先,事件監聽機制中由事件源,事件,事件監聽器三類對象組成。
事件監聽器處理流程:
- 為事件源(例如:button)設置一個監聽器,用於監聽用戶的操作(點擊操作等)
- 用戶做出的操作觸發事件源的監聽器
- 自動生成對應的事件對象
- 將事件源對象作為參數傳給事件監聽器
- 事件監聽器對事件對象進行判斷,執行對應的事件處理器(處理方法)
(二)五種不同使用方式:
以給按鈕添加點擊生成Toast信息事件為例
1.用匿名內部類
該方法是最為常用的方法,但是復用性不高
1 Button bt1=(Button)findViewById(R.id.bt1); 2 3 bt1.setOnclickListener(new View.OnClickListener(){ 4 5 //重寫點擊事件的處理方法onClick() 6 7 @Override 8 9 public void onClick(View v){ 10 11 //顯示Toast信息 12 13 Toast.makeText(getApplicationContext(),”點擊按鈕”,Toast.LENGTH_SHORT).show(); 14 15 } 16 17 }
2.使用內部類
和上面的匿名內部類不同,其優點是在該類中可以進行復用,可直接訪問外部類的所有界面組件。
1 public class MainActivity extends Activity { 2 3 private Button bt1; 4 5 @Override 6 7 protected void onCreate(Bundle savedInstanceState) { 8 9 Super.onCreate(saveInstanceState); 10 11 SetContentView(R.layout.activity); 12 13 Bt1 = (Button) findViewById(R.id.bt1); 14 15 //直接new一個內部類對象作為參數 16 17 Bt1.setOnClickListener(new BtnClickListener()); 18 19 } 20 21 //定義一個內部類,實現View.OnClickListener接口,並重寫onClick()方法 22 23 Class BtnClickListener implements View.OnClickListener 24 25 { 26 27 @Override 28 29 Public void onClick (View v){ 30 31 Toast.makeText(getApplicationContext(),”點擊按鈕”, Toast.LENGTH_SHORT).show(); 32 33 } 34 35 } 36 37 }
3.使用外部類
另外創建一個處理時間的Java文件,這種形式用的比較少,因為外部類不能直接訪問用戶界面類中的組件,要通過構造方法將組件傳入使用,這昂導致的結果就是代碼不夠簡潔。
創建一個外部類:
1 public class Myclick implements View.OnClickListener{ 2 private TextView textView; 3 //把文本框作為參數傳入 4 public Myclick(TextView v){ 5 textView = v; 6 } 7 @Override 8 public void onClick(View v){ 9 //點擊按鈕后重設文本框的文字 10 textView.setText("已點擊按鈕"); 11 } 12 }
MainActivity.java:
1 public class MainActivity extends Activity{ 2 private Button btn1; 3 private TextView tv1; 4 @Override 5 protected void onCreate(Bundle savadInstanceState){ 6 super.onCreate(savadInstanceState); 7 setContentView(R.layout.activty_main); 8 btn1 = (Button) findViewById(R.id.btn1); 9 tv1 = (TextView) findViewById(R.id.tv1); 10 //new一個外部類,並把TEXTVIEW作為參數傳入 11 btn1.setOnClickListener(new Myclick(tv1)); 12 } 13 }
4.直接使用Activity作為事件監聽器
讓Actiity類實現XxxListener事件監聽接口,在Activity中定義重寫對應的時間處理器方法。
eg:Activity類實現了OnClickListener接口,重寫了OnClick(View v)方法在為某些組件添加事件監聽對象時,直接setXxx.Listener(this)即可
1 import android.app.Activity; 2 import android.os.Bundle; 3 import android.view.View; 4 import android.widget.Button; 5 import android.widget.Toast; 6 7 public class MainActivity extends Activity implements View.OnClickListener{ 8 private Button btn; 9 @Override 10 protected void onCreate(Bundle savedInstanceState){ 11 super.onCreate(savedInstanceState); 12 setContentView(R.layou.activity_main); 13 14 btn = (Button) findViewById(R.id.btn); 15 btn.setOnClickListener(this); 16 17 } 18 19 //重寫接口中的抽象方法 20 @Override 21 public void onClck(View v){ 22 Toast.makeText(getApplicationContext(),"點擊了按鈕",Toast.LENGTH_SHORT).show(); 23 } 24 }
5.直接綁定標簽
在xml布局文件中對應的Activity中定義一個事件處理方法
eg:public void myClick(View source)
source對應事件源(組件)接着布局文件中對應要觸發事件的組件,設置一個屬性: onclick="myclick"即可
MainActivity.java
1 public class MainActivity extends Activity{ 2 private Button btn; 3 @Override 4 protected void onCreate(Bundle savedInstanceState){ 5 super.onCreate(savedInstanceState); 6 setContentView(R.layou.activity_main); 7 8 9 10 } 11 12 //自定義一個方法,傳入一個view組件作為參數 13 public void myclick(View source){ 14 Toast.makeText(getApplicationContext(),"點擊按鈕",Toast.LENGTH_SHORT).show(); 15 } 16 17 }
main.xml布局文件:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <Button 7 android:layout_width="wrap_content" 8 android:layout_height="wrap_content" 9 android:text="按鈕" 10 android:onClick="myclick"/> 11 12 </LinearLayout>
四、總結
在我們使用中,會根據不同的情況,而選擇不同的方法去對事件進行處理。
方法1(匿名),一般用於給特定組件的特定業務響應
方法2和方法3(內部類與外部類),可以同時為多個UI共同的事件處理,適用於對個UI組件復用,但當事件源要傳遞信息給事件監聽器時則不太靈活,必須通過成員變量及構造方法
方法4(activity本身作為監聽器),是我們日常業務中應用最多的一種方法。
方法5(xml標簽),通過設置UI組件的android:onClick屬性,然后通過代碼實現方法,這種方式因為業務邏輯和UI耦合性太高,實際業務中一般不用