一、事件監聽是什麼?
其實就簡單的一句話:響應用戶的操作,然後在後臺加上相應的操作。比如:我們點擊了頁面上的一個按鈕,事件監聽捕捉到了點擊
,然後再給出用戶一種反饋。
二、事件監聽機制流程
話不多說,先上個流程圖:
寫一個事件大致步驟爲:
- 進行
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();
}