1、自定義內部類
2、匿名內部類
3、當前activity去實現事件接口
4、在布局文件xml中添加點擊事件屬性(使用頻率非常高)
補充:
a、Android 在xml文件中 給某個控件聲明 id 是: "@+/自定義名字" ,
獲取是: "@/自定義的名字" , 例如: android:id="@id/btn1", 文本 android:text="@string/long_text" ,圖片等。
b、安卓的View 的繼承關系:
安卓的View繼承關系.png
1、自定義內部類 MyClickListener
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1、獲取按鈕(自定義內部類)
Button btn = findViewById(R.id.btn1); // 通過 findViewById 去找索引
// 2、注冊按鈕
MyClickListener mclick1 = new MyClickListener();
btn.setOnClickListener(mclick1);
}
// 3、內部類 -- 點擊事件觸發
class MyClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
Log.e("tag","點擊了......");
}
}
xml文件
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="按鈕點擊事件">
2、匿名內部類(就是 生成對象的時候才知道是什么類名)
做參數 傳參的時候 new Xxxxclass 就是匿名對象了。
Button btn2 = findViewById(R.id.btn1);
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("Tag","通過匿名內部類實現按鈕點擊");
}
});
3、當前activity去實現事件接口
自己寫個接口,根據1中的“自定義內部類” 思想,我們可以看到只要是一個類都是可以 執行(implements)一個接口。那么為何自己的類 使用不是更好嗎?是的,開工,跟著我實現這個接口吧。
// implements View.OnClickListener 是自己添加的 要實現的接口
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 定義一個按鈕
Button btn3 = findViewById(R.id.btn1);
btn3.setOnClickListener(this);// this 指當前類
}
@Override
public void onClick(View view) {
Log.e("TAG","使用本類實現了OnClickListener");
}
}
4、在布局文件xml中添加點擊事件屬性
xml文件是這樣 --- 推薦給個ID
android:id="@+id/btn4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="在xml文件中綁定事件"
android:onClick="myAction"/>
android:id="@+id/btn5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="在xml文件中綁定事件"
android:onClick="myAction"/>
//參數:被點擊的控件對象 View
public void myAction(View v){
switch (v.getId()){
case R.id.btn4:
Log.e("TAG","通過xml綁定點擊事件 btn4");
break;
case R.id.btn5:
Log.e("TAG","通過xml綁定點擊事件 btn5");
break;
}
}
demo效果:
最后一種經常使用.jpeg
疑惑?
為什么click里邊都是 onClick(View view),我點擊的是Button呀!
答:上面給了個View的繼承關系,button也是繼承View的。因為點擊事件并不僅僅Button才有事件,其它UI控件也要,所以使用View更加合適。
總結:
1、如果多個按鈕(點擊事件)的操作差不多就使用自定義,可以減少代碼,更加簡潔。
2、如果某個按鈕的事件是唯一的,那么使用 匿名內部類吧。(沒有絕對,只有更好)
3、xml中綁定事件 經常使用。