安卓基础学习——点击事件监听的四种写法

  在学习安卓开发的过程中,按钮是最常用的UI组件,可以通过点击按钮实现不同的动作,要想实现按钮的点击功能,需要对按钮设置监听器,其中一些概念需要重点理解,在此给出详细介绍:

一、UI事件的理解

  1. 事件:当我们点击UI界面时,系统会自动创建相应的事件对象,事件是系统自动创建的;
  2. 事件源:产生事件的组件,例如当我们按下按钮时,按钮就是事件源;
  3. 监听器:系统通过监听器实现对事件的拦截处理。

安卓基础学习——点击事件监听的四种写法
安卓基础学习——点击事件监听的四种写法

二、按钮点击事件的实现步骤

  通过上面的理解可以知道,当我们按下按钮时,系统会自动创建一个点击事件,并调用按钮设置好的监听器中的onclick()方法。因此我们要实现点击按钮时产生相应动作,需要对其设置监听器。实现按钮点击动作的步骤如下:

  1. 在xml文件中给出bButton控件;
  2. 在Activity中通过findViewById进行实例化;
  3. 通过按钮对象的setOnClickListener(OnClickListener l)方法设置监听器
  4. 在监听器对象中的onClick方法中设置点击动作。

  其中步骤三种setOnClickListener(OnClickListener l)方法需要传入一个OnClickListener对象,然而OnClickListener是View中的一个接口,以下是其源码。要想得到其对象,有两种方式:

 (1)通过匿名内部类对象实现;
 (2)将该Activity类实现OnClickListener接口,将this作为其对象;
  相应的可以得到三种点击事件的写法。(匿名内部类对象可以直接在调用setOnClickListener方法时进行new,也可以将其作为成员变量,在传入setOnClickListener方法)

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

三、按钮点击事件的写法

  1. 通过setOnClickListener(new View.OnClickListener )实现,一般用于只有一个按钮需要设置点击事件的情况,实现代码如下:
public class MainActivity extends Activity {
    private Button btn_setonclicklistener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); //加载界面
        
        btn_setonclicklistener = (Button) findViewById(R.id.btn_setonclicklistener);//实例化按钮对象
        
        //通过匿名内部类设置监听器
        btn_setonclicklistener.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}
  1. 通过匿名内部类对象作为成员变量实现,该方法其实就是将匿名内部类进行了抽取,在多次设置监听器时减少了代码量,相应的实现代码如下:
public class ThirdActivity extends AppCompatActivity {

    private Button btn_setonclicklistener1;
    private Button btn_setonclicklistener2;
    private Intent intent;
    //创建OnClickListener接口的匿名内部类对象
    private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_setonclicklistener1:
                    Toast.makeText(ThirdActivity.this,"第一个按钮被点击",Toast.LENGTH_SHORT).show();
                    startActivity(intent);
                    break;
                case R.id.btn_setonclicklistener2:
                    Toast.makeText(ThirdActivity.this,"第二个按钮被点击",Toast.LENGTH_SHORT).show();
                    startActivity(intent);
                    break;
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
        btn_setonclicklistener1 = (Button) findViewById(R.id.btn_setonclicklistener1);
        btn_setonclicklistener2 = (Button) findViewById(R.id.btn_setonclicklistener2);
        btn_setonclicklistener1.setOnClickListener(listener);
        btn_setonclicklistener2.setOnClickListener(listener);
        intent = new Intent(this, FourthActivity.class);

    }
}```

 3. 通过this实现,这种方法需要本身的Activity实现OnClickListener接口,一般用于多个按钮需要设置监听器,相应的实现代码如下:

```java
public class SecondActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn_setonclicklistener1;
    private Button btn_setonclicklistener2;
    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        btn_setonclicklistener1 = (Button) findViewById(R.id.btn_setonclicklistener1);
        btn_setonclicklistener2 = (Button) findViewById(R.id.btn_setonclicklistener2);
        btn_setonclicklistener1.setOnClickListener(this);
        btn_setonclicklistener2.setOnClickListener(this);
        intent = new Intent(this, ThirdActivity.class);
    }

    @Override
    public void onClick(View v) {  //v就是发生事件的视图对象(被点击的按钮)
        switch (v.getId()){
            case R.id.btn_setonclicklistener1:
            
                //这里的this就是SecondActivity的对象本身,因此不需要使用SecondActivity.this
                Toast.makeText(this,"第一个按钮被点击",Toast.LENGTH_SHORT).show();
                startActivity(intent);
                break;
            case R.id.btn_setonclicklistener2:
                Toast.makeText(this,"第二个按钮被点击",Toast.LENGTH_SHORT).show();
                startActivity(intent);
                break;
        }

    }
}
  1. 通过Button接口的onClick属性实现,该方法只需要在xml文件添加Button接onClick属性,并在Activity中给下相应的方法即可,是最简单的实现,相应的实现代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_height="match_parent"
    tools:context="com.example.hp.setonclicklistener.SecondActivity">
    <Button
        android:id="@+id/btn_setonclicklistener2"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:textSize="20sp"
        android:padding="10dp"
        android:layout_marginTop="40sp"
        android:text="通过按钮属性设置点击事件"
        android:onClick="startMainActivity"
        />

</LinearLayout>
public class FourthActivity extends AppCompatActivity {

    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fourth);
        intent = new Intent(this, MainActivity.class);
    }
    //直接给出Onclick属性对应的方法即可
    public void startMainActivity(View v){
        startActivity(intent);
    }
}
上一篇:java-将Onclick()添加到ArrayList中的项目


下一篇:使用Android中的GestureDetector处理singleClick和LongPress