文章目录
获取按钮
首先,为了处理事件,给我们的按钮加上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: " );
}
}