文章目录
获取按钮
首先,为了处理事件,给我们的按钮加上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.v和Log.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就可以找到这些调试信息。一次长按后,可以看到输出如下:
 
 而且,如果按住鼠标移动,还能看到更多的触摸动作被报告出来。
这是因为触摸动作主要有三类:按下、松手和移动,代号分别为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;
            }
        });
 
这样就可以在调试信息看到更详细的动作触发情况:
 
事件函数返回值背后的机制
仔细观察,可以发现在长按事件和触摸事件的函数为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: " );
    }
}
 











