1. 理解
事件監(jiān)聽機(jī)制是一種委派式的事件處理機(jī)制,事件源(組件)將事件處理委托給事件監(jiān)聽器,當(dāng)事件源發(fā)生指定事件時,就通知指定事件監(jiān)聽器,執(zhí)行相應(yīng)的操作编振。
2. 五種不同的使用形式
2.1. 匿名內(nèi)部類做監(jiān)聽器
2.2. 內(nèi)部類作事件監(jiān)聽器
2.3. 外部類作監(jiān)聽器
2.4. 直接使用Activity作為事件監(jiān)聽器
2.5. 直接綁定到標(biāo)簽
2.1 匿名內(nèi)部類作為事件監(jiān)聽器
平時最常用的一種:直接setXxxListener后,重寫里面的方法即可; 通常是臨時使用一次,復(fù)用性不高!
實現(xiàn)代碼:
layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:textColor="@color/colorAccent"
android:text="@string/btn" />
</RelativeLayout>
MainActivity.java
package io.pifoo.event;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn);
//匿名內(nèi)部類做監(jiān)聽器
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"點擊了按鈕",Toast.LENGTH_LONG).show();
}
});
}
}
運行結(jié)果:
2.2 內(nèi)部類作事件監(jiān)聽器
和上面的匿名內(nèi)部類不同哦臭埋!
使用優(yōu)點:可以在該類中進(jìn)行復(fù)用,可直接訪問外部類的所有界面組件踪央!
實現(xiàn)代碼
layout/activity_main.xml
同2.1
MainActivity.java
package io.pifoo.event;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn);
//直接new一個內(nèi)部類對象作為參數(shù)
btn.setOnClickListener(new BtnClickListener());
}
//定義一個內(nèi)部類,實現(xiàn)View.OnClickListener接口,并重寫onClick()方法
class BtnClickListener implements View.OnClickListener{
@Override
public void onClick (View v){
Toast.makeText(getApplicationContext(), "點擊了按鈕", Toast.LENGTH_LONG).show();
}
}
}
2.3 外部類作監(jiān)聽器
就是另外創(chuàng)建一個處理事件的Java文件,這種形式用的比較少!
因為外部類不能直接訪問用戶界面類中的組件,要通過構(gòu)造方法將組件傳入使用;這樣導(dǎo)致的結(jié)果就是代碼不夠簡潔瓢阴!
實現(xiàn)代碼
ps:
為了演示傳參,這里用TextView代替Toast提示畅蹂!
layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:textColor="@color/colorAccent"
android:text="@string/btn" />
<TextView
android:id="@+id/txt"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
外部類 MyClick.java
package io.pifoo.event;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
/**
* Created by pifoo on 15/10/15.
*/
//外部類實現(xiàn)OnClickListener接口,并重寫onClick()方法
public class MyClick implements OnClickListener {
private TextView textshow;
//把文本框作為參數(shù)傳入(外部類不能直接訪問用戶界面類中的組件,要通過構(gòu)造方法將組件傳入使用)
public MyClick(TextView txt) {
textshow = txt;
}
@Override
public void onClick (View v){
//點擊后設(shè)置文本框顯示的文字
textshow.setText("點擊了按鈕!");
}
}
MainActivity.java
package io.pifoo.event;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn);
txt = (TextView)findViewById(R.id.txt);
//直接new一個外部類對象,傳入組件
btn.setOnClickListener(new MyClick(txt));
}
}
運行結(jié)果
2.4 4.直接使用Activity作為事件監(jiān)聽器: Activity實現(xiàn)對應(yīng)接口,重寫相關(guān)方法
只需要讓Activity類實現(xiàn)XxxListener事件監(jiān)聽接口,在Activity中定義重寫對應(yīng)的事件處理器方法 。
eg: Actitity實現(xiàn)了OnClickListener接口,重寫了onClick(view)方法在為某些組件添加該事件監(jiān)聽對象時,直接setXxx.Listener(this)即可
實現(xiàn)代碼
layout/activity_main.xml
同2.3
MainActivity.java
package io.pifoo.event;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
//讓Activity類實現(xiàn)OnClickListener接口
public class MainActivity extends Activity implements OnClickListener {
private Button btn;
private TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn);
txt = (TextView)findViewById(R.id.txt);
//直接寫個this
btn.setOnClickListener(this);
}
//重寫接口中的抽象方法
@Override
public void onClick(View v) {
txt.setText("點擊了按鈕");
}
}
2.5 直接綁定到標(biāo)簽
就是直接在xml布局文件中對應(yīng)得Activity中定義一個事件處理方法
eg: public void myClick(View source) 炫掐,source對應(yīng)事件源(組件) 魁莉,
接著布局文件中對應(yīng)要觸發(fā)事件的組建,設(shè)置一個屬性:onclick = “myclick”即可
實現(xiàn)代碼
layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:textColor="@color/colorAccent"
android:onClick="myClick"
android:text="@string/btn" />
<TextView
android:id="@+id/txt"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
MainActivity.java
package io.pifoo.event;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity{
private TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView)findViewById(R.id.txt);
}
//自定義一個方法,傳入一個view組件作為參數(shù)
public void myClick(View source) {
txt.setText("點擊了按鈕");
}
}
小結(jié)
本節(jié)給大家介紹了Android中的事件處理機(jī)制,例子中的是onClickListener點擊事件募胃,當(dāng)然除了這個以外還有其他的事件,比如onItemClickListener畦浓,凡是需要通過setXxxListener這些痹束,基本上都是基于事件監(jiān)聽的!
另外這五種方式用的比較多的是:1讶请,2祷嘶,3屎媳,5幾種,看具體情況而定~