Android开发之Button事件处理

文章目录

获取按钮

首先,为了处理事件,给我们的按钮加上id,这样才能在Java代码中获取并调用。

activity_main中加入

android:id="@+id/wifi_button"

在Java代码中获取该按钮

findViewById(R.id.wifi_button);

三种基本事件

MainActivity.java文件中,添加这三个基本事件的代码

点击事件

wifi_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

长按事件

wifi_button.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                return false;
            }
        });

触摸事件

wifi_button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                return false;
            }
        });

在AS里输入setOnClickListener,再在括号里输入new OnCli...之类的再按回车AS就会自动补全代码,会用代码补全真的是方便很多。

在调试信息里观察事件的触发情况

可以用Log类在调试信息里输出,有五种Log函数:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 。根据首字母对应VERBOSE,DEBUG,INFO, WARN,ERROR。他们的区别主要在调试信息里输出的颜色不同。

Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("","")

Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择。

Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.vLog.d的信息,但会显示i、w和e的信息。

Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。

Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。

上面是从别的博客找到的信息,但是在我的AS里实测只有Log.e有颜色变化,暂时不知道原因。

但在这里,我们没有这么多讲究,直接用Log.e就行,在AS里输入loge就可以自动补全出Log.e(TAG, "onClick: " );其中TAG为打印信息的标签,msg里是具体信息。

这里TAG还没有定义,补上一个字符串常量private static final String TAG = "ShadyPi";

完整代码为

package com.example.mybutton;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "ShadyPi";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button wifi_button=findViewById(R.id.wifi_button);
        //点击
        wifi_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.e(TAG, "onClick: " );
            }
        });
        //长按
        wifi_button.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                Log.e(TAG, "onLongClick: " );
                return false;
            }
        });
        //触摸事件
        wifi_button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                Log.e(TAG, "onTouch: " );
                return false;
            }
        });
    }
}

这样,运行app,然后调出调试信息栏Logcat,在搜索框输入ShadyPi就可以找到这些调试信息。一次长按后,可以看到输出如下:
Android开发之Button事件处理
而且,如果按住鼠标移动,还能看到更多的触摸动作被报告出来。

这是因为触摸动作主要有三类:按下、松手和移动,代号分别为0,1,2。我们可以在触摸动作的信息输出部分添加motionEvent.getAction()输出动作类型,即

wifi_button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                Log.e(TAG, "onTouch: " + motionEvent.getAction());
                return false;
            }
        });

这样就可以在调试信息看到更详细的动作触发情况:
Android开发之Button事件处理

事件函数返回值背后的机制

仔细观察,可以发现在长按事件和触摸事件的函数为boolean函数,而点击事件是void函数,且两个boolean函数返回的都是false

将触摸事件的返回值改为true,发现调试信息不再输出长按事件与点击事件,只输出触摸事件;将触摸事件改回false,长按事件改为true,发现调试信息不再输出点击事件。

这是因为系统调用这三个函数时,是按照触摸、长按、点击这样的顺序执行的,并且通过前面函数的返回值判断是否继续执行后面的函数。当前面的函数返回true时,称之为“事件被消费了”,不再调用后面的函数。

在xml文件中设置回调函数

如果不想使用上面的onClick等函数,也可以在activity_main.xml里指定一个另外的函数作为事件的响应,并在Java代码里自定义该函数。

首先在xml文件把按钮的onClick属性设置为MyClick,即android:onClick="MyClick"。因为此时我们还没有声明MyClick这个函数,AS会报错,这时点击Alt+Enter AS就会建议你创建该函数,点击后就会在MainActivity.java里生成一个框架:

public void MyClick(View view) {
    }

这个函数就可以替代onClick的作用,把原来的函数注释掉,再补全新函数,可以实现相同的功能:

package com.example.mybutton;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "ShadyPi";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button wifi_button=findViewById(R.id.wifi_button);
        //点击
//        wifi_button.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                Log.e(TAG, "onClick: " );
//            }
//        });
        //长按
        wifi_button.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                Log.e(TAG, "onLongClick: " );
                return false;
            }
        });
        //触摸事件
        wifi_button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                Log.e(TAG, "onTouch: " + motionEvent.getAction());
                return false;
            }
        });
    }

    public void MyClick(View view) {
        Log.e(TAG, "MyClick: " );
    }
}

Android开发之Button事件处理

上一篇:基于UHD源码实现的四通道收发实例


下一篇:加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Section 3 The law of averages, and expected values