[Android] 按钮单击事件的五种写法

摘要:
在平时学习Android的过程中,无论是看视频还是博客,我发现每个人对代码的编写都有不同的偏好。明显的区别是控制响应事件的编写。所以我想总结一下这些写作方法,比较各种写作方法的优缺点,希望自己能够灵活选择编码方法。

在平时学习安卓的过程中,不论是看视频还是看博客,我发现每个人对代码的写法都有不同的偏好,比较明显的就是对控件响应事件的写法的不同。所以我想把这些写法总结一下,比较下各种写法的优劣,希望可以让自己可以灵活地选择编码方式。

原文地址请保留http://www.cnblogs.com/rossoneri/p/3975468.html

xml文件

1     <Button
2         android:id="@+id/button1"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:text="Button1" />
6 
7     <Button
8         android:id="@+id/button2"
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:text="Button2" />

四种方法:

  • 匿名内部类
1 public class TestButtonActivity extendsActivity {
2 
3 Button btn1, btn2;
4 Toast tst;
5 
6 @Override
7     protected voidonCreate(Bundle savedInstanceState) {
8         super.onCreate(savedInstanceState);
9 setContentView(R.layout.activity_test_button);
10 
11         btn1 =(Button) findViewById(R.id.button1);
12         btn2 =(Button) findViewById(R.id.button2);
13 
14        btn1.setOnClickListener(new OnClickListener() {
15 
16 @Override
17             public voidonClick(View v) {
18                 //TODO Auto-generated method stub
19                 Toast tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT);
20 tst.show();
21 
22 }
23 });
24 
25         btn2.setOnClickListener(new OnClickListener() {
26 
27 @Override
28             public voidonClick(View v) {
29                 //TODO Auto-generated method stub
30                 Toast tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT);
31 tst.show();
32 }
33 });
34 }
35 
36 }
  • 自定义单击事件监听类
1 public class TestButtonActivity extendsActivity {
2 
3 Button btn1, btn2;
4 Toast tst;
5 
6     class MyClickListener implementsOnClickListener {
7 
8 @Override
9         public voidonClick(View v) {
10             //TODO Auto-generated method stub
11             switch(v.getId()) {
12             caseR.id.button1:
13                 tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT);
14 tst.show();
15                 break;
16             caseR.id.button2:
17                 tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT);
18 tst.show();
19                 break;
20             default:
21                 break;
22 }
23 }
24 
25 }
26 
27 @Override
28     protected voidonCreate(Bundle savedInstanceState) {
29         super.onCreate(savedInstanceState);
30 setContentView(R.layout.activity_test_button);
31 
32         btn1 =(Button) findViewById(R.id.button1);
33         btn2 =(Button) findViewById(R.id.button2);
34 
35         btn1.setOnClickListener(newMyClickListener());
36         btn2.setOnClickListener(newMyClickListener());
37 }
38 
39 }
  • Activity继承View.OnClickListener,由Activity实现OnClick(View view)方法,在OnClick(View view)方法中用switch-case对不同id代表的button进行相应的处理
1 public class TestButtonActivity extends Activity implementsOnClickListener {
2 
3 Button btn1, btn2;
4 Toast tst;
5 
6 @Override
7     protected voidonCreate(Bundle savedInstanceState) {
8         super.onCreate(savedInstanceState);
9 setContentView(R.layout.activity_test_button);
10 
11         btn1 =(Button) findViewById(R.id.button1);
12         btn2 =(Button) findViewById(R.id.button2);
13 
14         btn1.setOnClickListener(this);
15         btn2.setOnClickListener(this);
16 }
17 
18 @Override
19     public voidonClick(View v) {
20         //TODO Auto-generated method stub
21         switch(v.getId()) {
22         caseR.id.button1:
23             tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT);
24 tst.show();
25             break;
26         caseR.id.button2:
27             tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT);
28 tst.show();
29             break;
30         default:
31             break;
32 }
33 }
34 }
  • 最后一种是我今天看到的一种写法,在XML文件中“显示指定按钮的onClick属性,这样点击按钮时会利用反射的方式调用对应Activity中的click()方法”[注1]
1     <Button
2         android:id="@+id/button1"
3 android:layout_width="wrap_content"
4 android:layout_height="wrap_content"
5 android:onClick="onClick"
6 android:text="Button1" />
7 
8     <Button
9         android:id="@+id/button2"
10 android:layout_width="wrap_content"
11 android:layout_height="wrap_content"
12 android:onClick="onClick"
13 android:text="Button2" />

这里在输完android:的时候按下 Alt+/ 会有 onClick 属性的提示, 但输入到 android:onClick=“ 的地方按下 Alt+/ 并没有提示 onClick 选项,让我突然觉得这里好像有点问题。

1 public class TestButtonActivity extendsActivity {
2 
3 Button btn1, btn2;
4 Toast tst;
5 
6 @Override
7     protected voidonCreate(Bundle savedInstanceState) {
8         super.onCreate(savedInstanceState);
9 setContentView(R.layout.activity_test_button);
10 }
11 
12     //注意 这里没有 @Override 标签
13     public voidonClick(View v) {
14         //TODO Auto-generated method stub
15         switch(v.getId()) {
16         caseR.id.button1:
17             tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT);
18 tst.show();
19             break;
20         caseR.id.button2:
21             tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT);
22 tst.show();
23             break;
24         default:
25             break;
26 }
27 }
28 }

这种写法整个代码中都不用声明button就可以实现button的单击事件。

以上就是四种实现按钮单击事件的方法。

粗略总结一下,就是按钮少的时候用匿名内部类会比较快,比如写demo测试的时候或者登陆界面之类的。

按钮多的情况我还是选择第三种方法,方便。

关于第四种方法,我感觉最方便,但看了很多代码还是觉得写法挺小众,不知为什么,这一点还需要我多研究研究。

[注1]这段话引用自Android - Button(按钮)的响应点击事件的4种写法

其中他所说的

1 public voidclick(View v){
2 ...
3 }

方法我试了下,运行时会报错。建议用我上面的示例代码。时间仓促,也没来得及细看出错原因,等有空再看一看。

2015.04.27 补:

可以在 xml 文件中为 <Button/> 增加 android:onclick="funcname" 属性,这个 funcname 就是在点击按钮后系统调用的 activity 里面的方法。比如:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

在activity里加入方法:

/**Called when the user clicks the Send button */
public voidsendMessage(View view) {
    //Do something in response to button
}

即可。

免责声明:文章转载自《[Android] 按钮单击事件的五种写法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python标准库Eclipse IDE的插件EPIC调试perl代码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

从壹开始 [Admin] 之五 ║ 实现『按钮』级别权限配置

一、前情回顾 哈喽大家好,在这个欢庆的日子里,老张祝大家工作都能蒸蒸日上!今天正好也是社团成立的第一天,我也是希望今天能是个纪念日,沾沾这个大喜庆! 更新: 这篇文章得到张善友,张队的阅读,并提供了另一个方案,大家可以看看,也是不错的。 地址: https://mp.weixin.qq.com/s/CCGANQ5i0Ainq3jcSt7k4A 放假这两...

redux简明学习

前面的话 这几天被redux折腾的够呛,看了很多视频,也看了很多资料。很多时候,感觉好像顿悟了,但实际上只是理解了其中的一个小概念而已。真正去做项目的时候,还是会卡壳。可能是学CSS和Javascript时花的时间太久了,学redux的时候有点浮躁。还有就是redux内容实在是不少,全部都看都理解,好像没什么必要。不看吧,用的时候总是有点力不从心。于是,决...

从点击Button到弹出一个MessageBox, 背后发生了什么

思考一个最简单的程序行为:我们的Dialog上有一个Button, 当用户用鼠标点击这个Button时, 我们弹出一个MessageBox。 这个看似简单的行为, 谁能说清楚它是如何运行起来的,背后究竟发生了什么?  下面是我个人尝试的解答: (1)我们的鼠标点击事件到达设备的驱动程序, 驱动程序把消息放入系统硬件输入队列SHIQ(system ha...

WebView加载完成与显示完成

想到来总结个,是因为项目中遇到了这样一个问题,在一个布局里有一个WebView,紧跟着webView有一个Button,当进入这个页面的时候,因为webView在没有加载出来的缘故,页面最上部先显示了button,等webView加载完成后,可以很明显的看到button的移动。 为了解决这个事情,我先是想把Button GONE掉,然后做一个监听,等web...

JavaScript学习总结(6)——js弹出框、对话框、提示框、弹窗总结

一、JS的三种最常见的对话框 [javascript] view plaincopy //====================== JS最常用三种弹出对话框 ========================          //弹出对话框并输出一段提示信息       function ale() {           //弹出一个对话...

dojo(五):Dijit-基本组件

转自:http://blog.csdn.net/trendgrucee/article/details/12679949 1、简介 Dijit是Dojo的UI框架,包含一系列丰富的组件以帮助你快速开发Web程序。考虑到大部分Web页面都是表单元素(指允许用户输入的组件,通常会被传送到服务器进行处理)。Dijit有很多基于表单的组件,包括按钮、文本框、可校验...