Android | 事件監聽處理機制的五種方式


一、事件監聽是什麼?

其實就簡單的一句話:響應用戶的操作,然後在後臺加上相應的操作。比如:我們點擊了頁面上的一個按鈕,事件監聽捕捉到了點擊,然後再給出用戶一種反饋

二、事件監聽機制流程

話不多說,先上個流程圖:

在這裏插入圖片描述
寫一個事件大致步驟爲:

  • 進行UI設計
  • 加載UI,獲得控件
  • 爲該控件設置監聽器,監聽用戶的操作
  • 用戶觸發事件源的監聽器
  • 生成對應事件對象
  • 將產生的事件對象作爲參數傳入事件處理器
  • 對事件對象進行判斷執行對應的事件的處理方法

三、五種不同的使用方式

任務:簡單的按鈕點擊,提示Toast信息的程序

0、效果展示

在這裏插入圖片描述

1、直接用匿名內部類

按照上面的步驟:

第一步:設計UI,由於只弄了個Button,不再貼出代碼,這個Button對應的ID是btn

第二步::加載UI,並獲得控件。

首先先聲明一個私有的對象:

private Button btn1;		//聲明Button

然後通過findViewById找到這個控件並強制轉換爲Button類型

btn1 = (Button) findViewById(R.id.btn);		//通過findViewById找到對應的控件

第三步:設置監聽器,使用setOnClickListener,然後匿名內部類裏面重寫了onClick方法

btn1.setOnClickListener(new OnClickListener() {		//爲該控件綁定事件監聽
	//重寫onClik方法,並寫上對應的操作
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Toast.makeText(getApplicationContext(), "你點擊了按鈕", Toast.LENGTH_LONG);
	}
});

接下來的步驟就是事件觸發的具體流程了,不再贅述,請看上方流程圖。

整合一下上述步驟:

	private Button btn1;		//聲明Button

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn1 = (Button) findViewById(R.id.btn);		//通過findViewById找到對應的控件
		btn1.setOnClickListener(new OnClickListener() {		//爲該控件綁定事件監聽
			//重寫onClik方法,並寫上對應的操作
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(getApplicationContext(), "你點擊了按鈕", Toast.LENGTH_LONG).show();
			}
		});
	}

匿名內部類是平常最常使用的一種,直接setXxxListeren後,重寫裏面的方法就行了;但它的複用性不高

2、使用內部類

有了上面的步驟,下面直接懟就行了:

	private Button btn1;		//聲明Button

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btn1 = (Button) findViewById(R.id.btn);		//通過findViewById找到對應的控件
		btn1.setOnClickListener(new BtnClickListener());		//直接new一個內部類當作參數傳遞
	}

	//定義一個類,實現OnClickListener接口
	class BtnClickListener implements OnClickListener{
		//重寫方法
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Toast.makeText(getApplicationContext(), "你點擊了按鈕", Toast.LENGTH_LONG).show();
		}
	}

使用內部類可以進行復用,可以直接訪問外部類的所有組件

3、使用外部類

由於外部類不能直接調用Activity界面上的控件,所以再調用外部類的時候需要用構造方法將需要的控件進行傳遞。

myClick.java

public class MyClick implements OnClickListener {

	private TextView tv;

	public MyClick(TextView tv) {
		// TODO Auto-generated constructor stub
		this.tv = tv;
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		tv.setText("你點擊了按鈕");
	}
}

MainActivity.java

	private Button btn1; // 聲明Button
	private TextView tv1;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.text);
		btn1 = (Button) findViewById(R.id.btn); // 通過findViewById找到對應的控件
		tv1 = (TextView) findViewById(R.id.tv);
		btn1.setOnClickListener(new MyClick(tv1));
	}

一般很少使用外部類處理事件監聽機制

4、直接使用Activity作爲事件監聽器

即用這個類直接實現OnClickListener接口,在這個類裏面重寫onClick方法即可:

public class MainActivity extends Activity implements OnClickListener {

	private Button btn1; // 聲明Button
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.text);
		btn1 = (Button) findViewById(R.id.btn); // 通過findViewById找到對應的控件
		btn1.setOnClickListener(this);		//直接寫this
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Toast.makeText(getApplicationContext(), "你點擊了按鈕", Toast.LENGTH_LONG).show();
	}
	//………還有方法沒有列出
}

5、直接綁定到標籤

直接在標籤上綁定點擊方法:

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="測試" 
        android:onClick="myClick"
        />

然後在直接寫自定義方法:

	public void myClick(View v) {
		Toast.makeText(getApplicationContext(), "你點擊了按鈕", Toast.LENGTH_LONG).show();
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章