Android学习笔记(二) 按钮控件Button

按钮控件Button

本节学习Android中按钮的常见用法

除了文本视图以外,Button也是一种基础控件。Button是由TextView派生而来,所以它可以使用文本视图的属性和方法。不同的是Button拥有默认的按钮背景,而TextView无背景;Button的内部文本默认居中对齐,而TextView的内部文本默认左对齐。此外还要需要额外注意textAllCaps与onClick两个属性,分别介绍如下:

1. textAllCaps属性

对于TextView来说,设置什么就显示什么,但是对于Button来说不管设置大写还是小写字符控件都真是转成大写展示。因为给Button标签补充textAllCaps属性,该属性默认为true表示全部转为大写,设置为false表示不展示大写。

代码示例如下:

1
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello World" android:textAllCaps="false"/>

效果如下:

image-20230414143212597

2. onClick属性

onClick对于前端开发应该都不陌生,在Android中该属性的值是个方法名,也就是当前页面Java代码存在的一个方法:当用户点击按钮时,就自动调用该方法。

譬如下面的Button标签指定了onClick属性值为doClick,表示点击该按钮后会出发Java代码中的doClick方法:

1
2
<Button android:id="@+id/btn_click_xml" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="doClick" android:text="直接指定点击方法" android:textColor="#000000" android:textSize="17sp" /> 
<TextView android:id="@+id/tv_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="这里查看按钮的点击结果" android:textColor="#000000" android:textSize="17sp" />

与之对应的页面中的Java中需要增加doClick方法,方法部分代码示例代码如下:

1
2
3
4
5
6
// activity_button_style.xml中给btn_click_xml指定了点击方法doClick 
public void doClick(View view) {
String desc = String.format("%s 您点击了按钮:%s", DateUtil.getNowTime(), ((Button) view).getText());
tv_result.setText(desc);
// 设置文本视图的文本内容
}

点击之前:

image-20230414145304173

点击之后:

image-20230414145324222

3 点击事件和长按事件

​ 虽然按钮控件能够在XML文件中通过onClick属性指定点击方法,但是方法的名称可以随便叫,既能叫doClick也能叫doTouch,甚至叫它doA或doB都没问题,这样很不利于规范化代码,倘若以后换了别人接手,就不晓得doA或doB是干什么用的。因此在实际开发中,不推荐使用Button标签的onClick属性,而是在代码中给按钮对象注册点击监听器。

​ 所谓监听器,意思是专门监听控件的动作行为,它平时无所事事,只有控件发生了指定的动作,监听器才会触发开关去执行对应的代码逻辑。点击监听器需要实现接口View.OnClickListener,并重写onClick方法补充点击事件的处理代码,再由按钮调用setOnClickListener方法设置监听器对象。下面的代码就是给控件btn_click_single设置的监听器:

1
2
Button btn_click_single = findViewById(R.id.btn_click_single);
btn_click_single.setOnClickListener(new MyOnClickListener);

上面的点击监听器名为MyOnClickListener,它的定义代码如下:

1
2
3
4
5
6
7
class MyOnClickListener implements View.OnClickListenter {
@Override
public void onClick(View v) {
String desc = String.format("%s 您点击了按钮:%s", DateUtil.getNowTime(),((Button)v).getText());
tv_result.setText(desc);//设置文本视图文本内容
}
}

运行后点击按钮效果如下:

image-20230414150527483

​ 如果一个页面只有一个按钮,单独定义新的监听器倒也无妨,可是如果存在许多按钮,每个按钮都定义自己的监听器,那就劳民伤财了。对于同时监听多个按钮的情况,更好的办法是注册统一的监听器,也就是让当前页面实现接口View.OnClickListener,如此一来,onClick方法便写在了页面代码之内。因为是统一的监听器,所以onClick内部需要判断是哪个按钮被点击了,也就是利用视图对象的getId方法检查控件编号,完整的onClick代码举例如下:

1
2
3
4
5
6
7
@Override public void onClick(View v) { // 点击事件的处理方法
if (v.getId() == R.id.btn_click_public) {
// 来自于按钮btn_click_public
String desc = String.format("%s 您点击了按钮:%s", DateUtil.getNowTime(), ((Button) v).getText());
tv_result.setText(desc); // 设置文本视图的文本内容
}
}

当然该页面的onCreate内部别忘了调用按钮对象的setOnClickListener方法,把按钮的点击监听器设置成当前页面,设置代码如下所示:

1
2
3
4
// 从布局文件中获取名为btn_click_public的按钮控件 
Button btn_click_public = findViewById(R.id.btn_click_public);
// 设置点击监听器,一旦用户点击按钮,就触发监听器的onClick方法
btn_click_public.setOnClickListener(this);

重新运行App后,点击第二个按钮发现onClick方法也可以正常执行了:

image-20230414161238060

除了点击事件,Button还提供长按事件,当控件被按住超过500毫秒即可触发长按事件。监听长按事件,可以使用setOnLongClickListener监听器。具体代码如下:

1
2
3
4
// 从布局文件中获取名为btn_click_public的按钮控件 
Button btn_longclick_public = findViewById(R.id.btn_longclick_public);
// 设置长按监听器,一旦用户长按按钮,就触发监听器的onLongClick方法
btn_longclick_public.setOnLongClickListener(this);

以上代码把长按监听器设置到当前页面,现在还需要实现对应的长按接口,并重写长按方法:

1
2
3
4
5
6
7
8
9
10
@Override 
public boolean onLongClick(View v) {
// 长按事件的处理方法
if (v.getId() == R.id.btn_longclick_public) { // 来自于按钮 btn_longclick_public

String desc = String.format("%s 您长按了按钮:%s", DateUtil.getNowTime(), ((Button) v).getText());
tv_result.setText(desc); // 设置文本视图的文本内容
}
return true;
}

再次运行,效果如下:

image-20230414161831245

值得注意的是,点击监听器和长按监听器不局限于按钮控件,其实它们都来源于视图基类View,凡是从View派生而来的各类控件,均可注册点击监听器和长按监听器。譬如文本视图TextView,其对象也能调用setOnClickListener方法与setOnLongClickListener方法,此时TextView控件就会响应点击动作和长按动作。因为按钮存在按下和松开两种背景,便于提示用户该控件允许点击,但文本视图默认没有按压背景,不方便判断是否被点击,所以一般不会让文本视图处理点击事件和长按事件。

4 禁用和恢复按钮

​ Button可以存在静止点击的状态,需要设置属性android:enabled为true可以点击反之不可点击。在Java代码中可以通过setEnabled设置按钮的可用状态。

​ 接下来通过一段代码演示按钮的禁用和启用状态。通过两个button来控制测试按钮的状态。代码如下:

1
2
3
4
5
6
7
8
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal">
<Button android:id="@+id/btn_enable" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="启用测试按钮" android:textColor="#000000" android:textSize="17sp" />
<Button android:id="@+id/btn_disable" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="禁用测试按钮" android:textColor="#000000" android:textSize="17sp" />
</LinearLayout>
<Button android:id="@+id/btn_test" android:layout_width="match_parent" android:layout_height="wrap_content" android:enabled="false" android:text="测试按钮" android:textColor="#888888" android:textSize="17sp" />
<TextView android:id="@+id/tv_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:text="这里查看测试按钮的点击结果" android:textColor="#000000" android:textSize="17sp" />
</LinearLayout>

效果如下:

image-20230414162650933

在Java代码中给三个按钮注册监听器,具体代码如下:

1
2
3
4
// 因为按钮控件的setOnClickListener方法来源于View基类,所以也可对findViewById得到的视图直 接设置点击监听器 
findViewById(R.id.btn_enable).setOnClickListener(this); findViewById(R.id.btn_disable).setOnClickListener(this);
btn_test = findViewById(R.id.btn_test); // 获取名叫btn_test的按钮控件
btn_test.setOnClickListener(this); // 设置btn_test的点击监听器

同时重写页面的onClick方法,分别处理3个按钮的点击事件,修改之后的onClick代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override public void onClick(View v) { 
// 点击事件的处理方法
// 由于多个控件都把点击监听器设置到了当前页面,因此公共的onClick方法内部需要区分来自于哪个 按钮
if (v.getId() == R.id.btn_enable) { // 点击了按钮“启用测试按钮”
btn_test.setTextColor(Color.BLACK); // 设置按钮的文字颜色
btn_test.setEnabled(true); // 启用当前控件
} else if (v.getId() == R.id.btn_disable) { // 点击了按钮“禁用测试按钮”
btn_test.setTextColor(Color.GRAY); // 设置按钮的文字颜色
btn_test.setEnabled(false); // 禁用当前控件
} else if (v.getId() == R.id.btn_test) { // 点击了按钮“测试按钮”
String desc = String.format("%s 您点击了按钮:%s", DateUtil.getNowTime(), ((Button) v).getText());
tv_result.setText(desc); // 设置文本视图的文本内容
}
}

最后编译运行App,点击了“启用测试按钮”之后,原本置灰的测试按钮btn_test恢复正常的黑色文本,点击该按钮发现界面有了反应,具体效果如下:

image-20230414162935262

对比上面两图,可以观察禁用和启用两个模式的区别。


Android学习笔记(二) 按钮控件Button
https://ilittle.fun/2023/04/14/Android学习笔记(二)/
作者
Leelt
发布于
2023年4月14日
许可协议