Android實現(xiàn)監(jiān)聽事件的三種方式(匿名內(nèi)部內(nèi)實現(xiàn),外部類實現(xiàn),接口實現(xiàn))詳解
1. 使用匿名內(nèi)部類的方式實現(xiàn)監(jiān)聽事件
使用方法:
- 首先為要實現(xiàn)監(jiān)聽的對象綁定監(jiān)聽器节榜,例如為一個Button對象綁定一個監(jiān)聽器
botton.setOnClickListener();
。 - 然后在
setOnClickListener()
方法中定義一個OnClickListener的匿名內(nèi)部類,然后重寫內(nèi)部類中的onClick方法。 - 最后在onClick方法中實現(xiàn)監(jiān)聽事件要實現(xiàn)的邏輯即可。詳細(xì)使用請看下文Demo代碼。
2. 使用外部類的方式實現(xiàn)監(jiān)聽事件
使用方法:
- 首先要自定義一個外部類替梨,實現(xiàn)OnClickListener接口,并重寫onClick方法,在onClick方法中可以定義這個外部類想實現(xiàn)的處理邏輯装黑,那么調(diào)用這個外部類實現(xiàn)監(jiān)聽事件時副瀑,都可以用super來調(diào)用這個類中的處理邏輯。這也是使用外部類實現(xiàn)監(jiān)聽事件的優(yōu)勢所在:可以將不同監(jiān)聽事件中大量重復(fù)的處理邏輯定義在這個類中恋谭,然后使用這個外部類實現(xiàn)監(jiān)聽事件時都可以使用super關(guān)鍵字來直接調(diào)用糠睡,而不用重復(fù)定義,減少重復(fù)代碼疚颊,提高代碼質(zhì)量狈孔。
- 為要實現(xiàn)監(jiān)聽的對象綁定監(jiān)聽器,然后在setOnClickListener()方法中使用我們自定義的外部類來實現(xiàn)監(jiān)聽事件材义。
- 重寫onClick方法均抽,并根據(jù)需要來決定是否需要使用super調(diào)用父類處理邏輯,并在onClick方法中定義自己的處理邏輯其掂。詳細(xì)使用請看下文Demo代碼油挥。
3. 使用接口方式實現(xiàn)監(jiān)聽事件
使用方法:
- 讓當(dāng)前類實現(xiàn)OnClickListener接口,并在當(dāng)前類中重寫onClick方法款熬。
- 在當(dāng)前類的onClick方法中實現(xiàn)處理邏輯深寥。
- 為需要實現(xiàn)監(jiān)聽事件的控件綁定監(jiān)聽器,并使用this調(diào)用本類中重寫的onClick方法贤牛。詳細(xì)使用請看下文Demo代碼翩迈。
Demo
layout_main如下:
在布局文件中,我定義了3個Button盔夜,分別以三種不同的方法實現(xiàn)監(jiān)聽事件,并為每一個Button定義了一個TextView,用來觀察監(jiān)聽事件的處理邏輯是否成功喂链。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="匿名內(nèi)部類監(jiān)聽事件方式"
android:layout_marginTop="40dp"
android:layout_gravity="center"/>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:text="這里顯示匿名內(nèi)部類監(jiān)聽事件方式的執(zhí)行邏輯"
android:textSize="15sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="外部類監(jiān)聽事件方式"
android:id="@+id/button2"
android:layout_marginTop="20dp"
android:layout_gravity="center" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:text="這里顯示外部類監(jiān)聽事件方式的執(zhí)行邏輯"
android:textSize="15sp"/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="接口實現(xiàn)監(jiān)聽事件方式"
android:layout_marginTop="20dp"
android:layout_gravity="center" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:text="這里顯示接口方式監(jiān)聽事件方式的執(zhí)行邏輯"
android:textSize="15sp"/>
</LinearLayout>
MianActivity代碼如下:
在MainActivity中我分別以三種不同的方式為每一個Button實現(xiàn)了監(jiān)聽事件返十,并未外部類實現(xiàn)方式中加入了外部類自己的處理邏輯。
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button bt1;
private Button bt2;
private Button bt3;
private TextView tv1;
private TextView tv2;
private TextView tv3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1 = (Button)findViewById(R.id.button1);
bt2 = (Button)findViewById(R.id.button2);
bt3 = (Button)findViewById(R.id.button3);
tv1 =(TextView)findViewById(R.id.textView1);
tv2 = (TextView)findViewById(R.id.textView2);
tv3 =(TextView)findViewById(R.id.textView3);
//1.使用匿名內(nèi)部類的方式實現(xiàn)監(jiān)聽事件
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv1.setText("我是匿名內(nèi)部類實現(xiàn)監(jiān)聽事件的執(zhí)行邏輯");
}
});
//2.使用外部類的方式實現(xiàn)監(jiān)聽事件
bt2.setOnClickListener(new MyOnClickListener() {
@Override
public void onClick(View v) {
//使用super即可調(diào)用外部類中的處理邏輯椭微,不調(diào)用也可以洞坑。
super.onClick(v);
tv2.setText("我是外部類實現(xiàn)監(jiān)聽事件的處理邏輯");
}
});
//3.使用接口方式實現(xiàn)監(jiān)聽事件
//這里由于是同類中的函數(shù),所以使用this即可調(diào)用OnClickListener接口中的onClick方法
bt3.setOnClickListener(this);
}
//復(fù)寫OnClickListener接口中的onClick方法
@Override
public void onClick(View v) {
//在onClick方法中定義處理邏輯
tv3.setText("我是接口方式實現(xiàn)監(jiān)聽事件的處理邏輯");
}
}
方法2中使用到的外部類MyOnClickListener如下:
這個類很簡單蝇率,實現(xiàn)OnClickListener并復(fù)寫onClick方法即可迟杂,這里我在onClick方法中實現(xiàn)了MyOnClickListener類自己的處理邏輯
public class MyOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
//這里寫自定義外部類的處理邏輯
//這里的處理邏輯是將調(diào)用這個方法的Button透明度設(shè)置為0.5
v.setAlpha(0.2f);
}
}
下面來看一下Demo程序的演示:
Demo
從demo中可以看出,三個Button均完成了監(jiān)聽事件的處理邏輯本慕,三個方式都達(dá)到了目的排拷。第二種方式中還實現(xiàn)了外部類MyOnClickListener中的處理邏輯,將第二個button的透明度設(shè)置為了0.3锅尘。
完监氢。