Android监听事件OnClickListener 的使用

Android 监听事件功能,可以实现点击就会完成相应的功能。实现监听事件有4种方法:

  1. 通过内部类实现
  2. 通过匿名内部类实现
  3. 通过当前Activity来实现
  4. 通过xml绑定来实现(使用最多的方法之一)

方法一:通过内部类实现.

首先在btn1上用setOnClickListener()设置一个监听功能。这时需要传进去一个OnClickListener的对象进去。

public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }

而OnClickListener是一个接口:

  public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }

因此需要在MainActivity里面创建一个类MyClickListener 实现OnClickListener的接口,然后将对象到 setOnClickListener中。

 具体实现代码为:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyClickListener mcl = new MyClickListener();
        Button btn1 = findViewById(R.id.btn1);
        btn1.setOnClickListener(mcl);
    }

    class MyClickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            Log.e("Button1","通过内部类来实现按钮点击监听");
        }
    }

}

 方法二:通过匿名内部类实现:

这个方法和方法一类似,区别在于方法一有明确的类名,而方法二是直接在setOnClickListener()的参数列表中new一个OnClickListener。


btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("Button2","通过匿名内部类来实现按钮点击监听");
            }
        });

方法三:通过当前的activity 类实现接口OnClickListener,并与button绑定。

从方法一种可以看出,实现的方法是新建一个类去实现OnClickListener接口,那么是不是可以在当前的activity类中去实现这个接口,这样就不需要再创建一个新类了。方法三就是这样实现的。由于是这个activity这个类上实现的接口,因此传入的是当前类的对象this。

public class ButtonActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.button_activity);
        
       
        Button btn3= findViewById(R.id.btn3);
        /*
        * 方法3: 通过当前activity 实现OnClickListener接口,然后绑定到指定的button上,
        * this表示当前类的实例化对象
        *
        * */
        btn3.setOnClickListener(this);
    

    @Override
    public void onClick(View v) {
        Log.e("Button3","通过当前activity来实现按钮点击监听");
    }


}

方法四:通过xml布局文件的属性android:onClick来绑定一个onclick函数,当点击这个button的时候就会执行onclick函数。

这个方法是使用最多的方法

实现步骤:

1. 在xml布局文件中增加 android:onClick属性

2.在activity中增加对应的函数myclick

  public void myclick(View v){
        Log.e("Button4","通过xml绑定点击事件");
    }

这个方法是应用最多的方法,但是有一个缺点,如果一个acivity中有很多button,需要绑定很多的click函数,那么就需要创建非常多的click函数,增加了后期代码维护的难度,因此可以才用下面的方式,将所有的button点击事件放在一个click中处理。v.getId会获取点击button的标志位,返回一个int类型的整数。可以根据这个返回值和通过R.id获取到的标志位来比较,然后执行相应的操作。

    public void myclick(View v){
        switch(v.getId()){
            case R.id.btn4 :
                Log.e("Button4","通过xml文件绑定监听");
                break;
            case R.id.btn5:
                Log.e("Button5","通过xml文件绑定监听");
                break;
        }
    }

 

 

strings.xml


    My Application
    通过内部类来实现按钮点击监听
    通过匿名内部类来实现按钮点击监听
    通过当前activity来实现监听
    通过xml绑定点击事件

最后是全部四种方法的具体代码实现:

button_activity.xml 




    

 

ButtonActivity:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class ButtonActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.button_activity);
        MyClickListener mcl = new MyClickListener();
        Button btn1 = findViewById(R.id.btn1);
        btn1.setOnClickListener(mcl);
        Button btn2 = findViewById(R.id.btn2);
        Button btn3= findViewById(R.id.btn3);
        Button btn4 = findViewById(R.id.btn4);
        /*
        * 方法3: 通过当前activity 实现OnClickListener接口,然后绑定到指定的button上,
        * this表示当前类的实例化对象
        *
        * */
        btn3.setOnClickListener(this);
    /*方法2: 通过匿名内部类实现按钮点击监听,这个方法中 OnClickListener没有实现接口的类名,是通过new直接实现的
      因此触发的事件只能和这个按钮绑定,不能复用。
     */
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("Button2","通过匿名内部类来实现按钮点击监听");
            }
        });
    }

    @Override
    public void onClick(View v) {
        Log.e("Button3","通过当前activity来实现按钮点击监听");
    }

    //方法1:btn1是通过内部类来实现按钮监听功能
    class MyClickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            Log.e("Button1","通过内部类来实现按钮点击监听");
        }
    }
    /*方法4:通过xml文件中绑定按钮监听,
    *多个按钮绑定的点击监听事件,可以通过一个click函数来实现
     */
    public void myclick(View v){
        switch(v.getId()){
            case R.id.btn4 :
                Log.e("Button4","通过xml文件绑定监听");
                break;
            case R.id.btn5:
                Log.e("Button5","通过xml文件绑定监听");
                break;
        }
    }


}

 

你可能感兴趣的:(android,安卓)