本节学习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"/>
|
效果如下:
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
| public void doClick(View view) { String desc = String.format("%s 您点击了按钮:%s", DateUtil.getNowTime(), ((Button) view).getText()); tv_result.setText(desc); }
|
点击之前:
点击之后:
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); } }
|
运行后点击按钮效果如下:
如果一个页面只有一个按钮,单独定义新的监听器倒也无妨,可是如果存在许多按钮,每个按钮都定义自己的监听器,那就劳民伤财了。对于同时监听多个按钮的情况,更好的办法是注册统一的监听器,也就是让当前页面实现接口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) { String desc = String.format("%s 您点击了按钮:%s", DateUtil.getNowTime(), ((Button) v).getText()); tv_result.setText(desc); } }
|
当然该页面的onCreate内部别忘了调用按钮对象的setOnClickListener方法,把按钮的点击监听器设置成当前页面,设置代码如下所示:
1 2 3 4
| Button btn_click_public = findViewById(R.id.btn_click_public);
btn_click_public.setOnClickListener(this);
|
重新运行App后,点击第二个按钮发现onClick方法也可以正常执行了:
除了点击事件,Button还提供长按事件,当控件被按住超过500毫秒即可触发长按事件。监听长按事件,可以使用setOnLongClickListener监听器。具体代码如下:
1 2 3 4
| Button btn_longclick_public = findViewById(R.id.btn_longclick_public);
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) {
String desc = String.format("%s 您长按了按钮:%s", DateUtil.getNowTime(), ((Button) v).getText()); tv_result.setText(desc); } return true; }
|
再次运行,效果如下:
值得注意的是,点击监听器和长按监听器不局限于按钮控件,其实它们都来源于视图基类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>
|
效果如下:
在Java代码中给三个按钮注册监听器,具体代码如下:
1 2 3 4
| findViewById(R.id.btn_enable).setOnClickListener(this); findViewById(R.id.btn_disable).setOnClickListener(this); btn_test = findViewById(R.id.btn_test); btn_test.setOnClickListener(this);
|
同时重写页面的onClick方法,分别处理3个按钮的点击事件,修改之后的onClick代码示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Override public void onClick(View v) { 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恢复正常的黑色文本,点击该按钮发现界面有了反应,具体效果如下:
对比上面两图,可以观察禁用和启用两个模式的区别。