在Android 應用開發(fā)過程中,常用監(jiān)聽事件如下:
- (1) ListView事件監(jiān)聽
setOn ItemSelectedListener:鼠標滾動時觸發(fā)
setOnItemClickListener: 點擊時觸發(fā)
- (2 )EditText 事件監(jiān)聽
setOnKeyListener: 獲取焦點時觸發(fā)
- (3) RadioGroup事件監(jiān)聽
setOnCheckedChangeListener: 點擊時觸發(fā)
- (4) CheckBox事件監(jiān)聽
setOnCheckedChangeListener :點擊時觸發(fā)
- (5 )Spinner事件監(jiān)聽
setOnltemSelectedListener:點擊時觸發(fā)
- (6) DatePicker 事件監(jiān)聽
onDateChangedListener: 日期改變時觸發(fā)
- (7 )DatePickerDialog 事件監(jiān)聽
onDateSetListener:設(shè)置日期時觸發(fā)
- (8) TimePicker 事件監(jiān)聽
onTimeChangedListener:時間改變時觸發(fā)
- (9 )TimePickerDialog 事件監(jiān)聽
onTimeSetListener: 設(shè)置時間時觸發(fā)
- (10)Button.ImageButton 事件監(jiān)聽
setOnClickListener: 點擊時觸發(fā)
- (11)Menu 事件監(jiān)聽
onOptionsltemSelected; 點擊時觸發(fā)
- (12 )Gallery 事件監(jiān)聽
setOnItemClickListener: 點擊時觸發(fā)
- (13 )GridView 事件監(jiān)聽
setOnltemClickListener: 點擊時觸發(fā)
實現(xiàn)事件監(jiān)聽器的方法:
內(nèi)部類形式
外類類形式
Activity本身作為事件監(jiān)聽器類
匿名內(nèi)部類形式
直接綁定到標簽
內(nèi)部類形式
內(nèi)部類形式
public class Test extends Activity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.about);
MyButtonlistener listener = new MyButtonlistener();
button.setOnClickListener(listener);
}
class MyButtonlistener implements View.OnClickListener{
@Override
public void onClick(View v) {
//相關(guān)事件處理
}
}
}
外部類形式
Test類
public class Test extends Activity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.about);
MyButtonlistener listener = new MyButtonlistener();
button.setOnClickListener(listener);
}
}
MyButtonlistener類
public class MyButtonlistener implements View.OnClickListener {
@Override
public void onClick(View v) {
//事件處理
}
}
Activity本身作為事件監(jiān)聽器類
public class Test extends Activity implements View.OnClickListener{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.about);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//事件處理
}
}
匿名內(nèi)部類形式
public class Test extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.about);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//事件處理
}
});
}
}
直接綁定到標簽
在xml的布局文件中加入onClick屬性,設(shè)置相關(guān)的方法
這里寫圖片描述

定義一個方法,記得參數(shù)是View
這里寫圖片描述

轉(zhuǎn)載 : https://blog.csdn.net/lyf970419/article/details/80762534
轉(zhuǎn)載:http://blog.sina.com.cn/s/blog_b9fc6c1f0102vg1g.html
第一種:匿名內(nèi)部類作為事件監(jiān)聽器類
Button button=(Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(){
public void onClick(View v){
System.out.println(“匿名內(nèi)部類作為事件監(jiān)聽類”);
}
});
大部分時候,事件處理器都沒有什么利用價值(可利用代碼通常都被抽象成了業(yè)務(wù)邏輯方法),因此大部分事件監(jiān)聽器只是臨時使用一次,所以使用匿名內(nèi)部類形式的事件監(jiān)聽器更合適,實際上,這種形式是目前是最廣泛的事件監(jiān)聽器形式。上面的程序代碼就是匿名內(nèi)部類來創(chuàng)建事件監(jiān)聽器的?。。?br> 對于使用匿名內(nèi)部類作為監(jiān)聽器的形式來說,唯一的缺點就是匿名內(nèi)部類的語法有點不易掌握,如果讀者java基礎(chǔ)扎實,匿名內(nèi)部類的語法掌握較好,通常建議使用匿名內(nèi)部類作為監(jiān)聽器。
第二種:內(nèi)部類作為監(jiān)聽器
public class ButtonTest extends Activity{
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
Button button =(Button) findViewById(R.id.button);
MyButton listener=new MyButton();
Button.setOnClickListener(listener);
}
Class MyButton implements OnClickListener{
public void onClick(View v){
System.out.println(“內(nèi)部類作為事件監(jiān)聽器”)
}
}
}
將事件監(jiān)聽器類定義成當前類的內(nèi)部類優(yōu)點:
1、使用內(nèi)部類可以在當前類中復用監(jiān)聽器類,因為監(jiān)聽器類是外部類的內(nèi)部類
2、所以可以自由訪問外部類的所有界面組件。這也是內(nèi)部類的兩個優(yōu)勢。上面代碼就是內(nèi)部類的形式?。?/p>
第三種:Activity本身作為事件監(jiān)聽器
public class ButtonTest extends Activity implements OnClickListener{
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
Button button =(Button) findViewById(R.id.button);
Button.setOnClickListener(this);
}
Public void onClick(View v){
System.out.println(“activity本身作為監(jiān)聽器”);
}
}
作為監(jiān)聽器類,可以直接在activity類中定義事件處理器方法,這種形式非常簡潔。但這種做法有兩個缺點:(1)這種形式可能造成程序結(jié)構(gòu)混亂。Activity的主要職責應該是完成界面初始化;但此時還需包含事件處理器方法,從而引起混亂。(2)如果activity界面類需要實現(xiàn)監(jiān)聽器接口,讓人感覺比較怪異。
上面的程序讓Activity類實現(xiàn)了OnClickListener事件監(jiān)聽接口,從而可以在該Activity類中直接定義事件處理器方法:onClick(view v),當為某個組件添加該事件監(jiān)聽器對象時,直接使用this作為事件監(jiān)聽器對象即可。
第四種:外部類作為監(jiān)聽器
ButtonTest類:
public class ButtonTest extends Activity{
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
Button button=(Button) findViewById(R.id.button);
Button.setOnClickListener(new MyButtonListener(“外部類作為事件監(jiān)聽類”));
}
}
當用戶單擊button按鈕時,程序?qū)|發(fā)MyButtonListener監(jiān)聽器
外部MyButtonListener類
public class MyButtonListener implements OnClickListener{
private String str;
public MyButtonListener(String str){
super();
this.str=str;
}
Public void onClick (View v) {
System.out.println(str);
}
}
使用頂級類定義事件監(jiān)聽器類的形式比較少見,主要因為如下兩個原因:
1、事件監(jiān)聽器通常屬于特定的gui界面,定義成外部類不籃球提高程序的內(nèi)聚性。
2、外部類形式的事件監(jiān)聽器不能自由訪問創(chuàng)建gui界面的類中的組件,編程不夠簡潔。
但如果某個事件監(jiān)聽器確實需要被多個gui界面所共享,而且主要是完成某種業(yè)務(wù)邏輯的實現(xiàn),則可以考慮使用外部類的形式來定義事件監(jiān)聽器類。
第五種:直接綁定到標簽
android還有一種更簡單的綁定事件監(jiān)聽器的的方式,直接在界面布局文件中為指定標簽綁定事件處理方法。
對于很多Android標簽而言,它們都支持如onClick、onLongClick等屬性,這種屬性的屬性值就是一個形如xxx
(View source)
的方法的方法名。在布局文件中為button添加屬性,如一代碼:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button"
android:onClick=”clickHandler” />
為Button按鈕綁定一個事件處理方法:clickHanlder,這意味著開發(fā)者需要在該界面布局對應的Activity中定義一個void clickHanler(View source)方法,該方法將會負責處理該按鈕上的單擊事件。
下面是該界面布局對應的java代碼:
public class ButtonTest extends Activity{
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
}
Public void clickHandler(View source) {
System.out.println(“直接綁定在標簽上的按鈕被點擊了”);
}
}