文档章节

Android控件系列之Button以及Android监听器

墨梅
 墨梅
发布于 2014/03/28 09:00
字数 1665
阅读 17
收藏 0

学习目的:

1、掌握在Android中如何建立Button

2、掌握Button的常用属性

3、掌握Button按钮的点击事件(监听器)

Button是各种UI中最常用的控件之一,它同样也是Android开发中最受欢迎的控件之一,用户可以通过触摸它来触发一系列事件,要知道一个没有点击事件的Button是没有任何意义的,因为使用者的固定思维是见到它就想去点!

先看下Android中普通Button的样子:

 

以及点中Button后的样子:

 

我在Android控件系列之XML静态资源中已经强调了布局和代码分离的重要性,因此本例中的Button我将用这种方式去实现:

1、为了设置Button上的值(如上图的“确定”),我们把这个值先作为一个资源存放在Res\values\strings.xml中:

<string name="btnText">确定</string>

其中btnText可以视作这个值的键或ID,确定则是它的值,我们最后绑定的是它的键,Android系统会自动根据键找到它的值。

2、在layout目录下的XML布局文件中,我们添加一个Button

<Button
     android:layout_width="fill_parent"
     android:layout_height ="wrap_content"
     android:text="@string/btnText"
     ></Button>

其中layout_width和layout_height属性是必须的,但具体的赋值可以根据您的项目需要

一般可以是具体的大小,即:数字+单位,如android:layout_height ="30px"

或者设置枚举的几种值:

fill_parent 它将自动放大到与父控件一样的大小,比如  android:layout_width="fill_parent"表示它的宽度将填满父控件的横向控件

wrap_content它将根据自己的值的占据控件来决定大小,一般使用这个值的控件会显的较小,好处是不需要测量具体大小,它一定会正好把所有的值给显示出来


而Text属性,则显示了按钮的值,如果android:layout_width用了wrap_content属性,这个值的长度将会隐式地决定按钮的宽度。

这个例子中,我们用资源文件的btnText所对应的值作为Button的值,那么如果我们要把“确定”改成“取消”,只需要改变strings.xml中的值即可,不需要改动任何java代码,对于那些需要将项目移植为其他语言版本的也是非常有用,比如要将软件卖给老外,可以将“确定”改成“OK”,而不需要重新编译。

3、为Button申明ID

继续在XML中为Button添加ID属性

android:id="@+id/btnOK"

+表示通过它来生成静态资源,如果没有+,表示使用的是指定位置的静态资源,一般为控件赋ID时,都使用+这个方法

保存XML后,可以发现R.java中已经有一个内部类id,这个id类有一个静态字段叫btnOK,它的具体值您根本不必关心,我们可以在代码中获得它。

4、在Activity中获取到这个Button实例

如果您想把每个控件ID都背下来,那可能很难,更合适的做法是利用R.id来获取指定的名称,而这个名称又唯一对应了控件ID

一般的,如果我们希望在某个Activity中使用按钮,您第一个想到的方法应该是findViewById,通过R中的静态ID,我们可以轻易获得控件实例,至于如何寻找,这是Android的事:

Button btn = (Button)findViewById(R.id.btnOK);

如果系统不能识别,您需要导入Android的Button所在的类包:

import android.widget.Button;

您可以在Activity的生命周期内,随时寻找到这个Button,但我强烈介意您,如果需要多次调用这个Button时,在onCreate中利用findViewById找到它后,把它记录在Activity的一个全局变量中,然后以后不需要再去find这个Button,因为find本身也需要时间,即使您没有察觉,但他的确需要花费时间。因为Android运行在手机或者平板电脑上,我建议您编码时充分考虑代码的简洁、效率,从而节省资源和电量。

获取到这个Button的实例后,我们可以利用代码为他赋值,比如btn.setText("按钮的值改变了");

5、为按钮定制监听器:

A、什么是监听器?

您需要记住以下几点:

  1、监听器是个抽象类,它包含了一个事件触发时系统会去调用的函数

  2、在子类中,根据您项目的需要重写这个函数

  3、派生后的监听器需要绑定到按钮上,就像一个耳机可以发出声音,但您不去戴它,您是听不到它发出的声音的。一般的情况是这个按钮可能需要这个监听器,而另外一个按钮需要另外一个监听器,每个监听器各司其职,但功能相似时,也可以多个按钮共同绑定一个监听器。

  4、各种控件,都有常用的事件,如点击按钮,拖动一个滚动条,切换一个ListView的选项等等,他的绑定监听器的函数命名规则是setOn****Listener

B、为什么要这么设计?

  1、当用户(也可能系统)触发某个控件的某个事件后,往往要处理一些细节,但他们不具有通用性,例如您可能点击按钮后改变它的值,也可能希望点击按钮后弹出一个网页,或者点击按钮后关闭当前Activity。正由于结果可能太多样,设计者索性将实现完全留给Android开放者去实现

  2、监听器其实是一种回调:

          它不需要您去执行On****Listener,而是系统触发后自动会去调用它,流程如下图:  
  

C、监听器如何定制?

您可以使用自定义内部类继承监听器抽象类,并实现抽象方法。您也可以使用Java提供的抽象类的匿名实现:

 复制代码

1 @Override
2  public void onCreate(Bundle savedInstanceState) {
3   super.onCreate(savedInstanceState);
4   setContentView(R.layout.main);
5   Button btn = (Button)findViewById(R.id.btnOK);
6   //绑定匿名的监听器,并执行您所要在点击按钮后执行的逻辑代码
7     btn.setOnClickListener(new View.OnClickListener() {
8            
9     @Override
10      public void onClick(View arg0) {
11      // TODO Auto-generated method stub
12      Toast.makeText(MyActivity.this, "点击了按钮", Toast.LENGTH_LONG).show();
13     }
14   });
15 }

复制代码

总结:

本文介绍了如何使用Android中Button的方法,并着重介绍了事件监听器的设计目的、运行流程和使用方法。

本文转载自:http://www.cnblogs.com/wt616/

墨梅
粉丝 16
博文 218
码字总数 43367
作品 0
杭州
后端工程师
私信 提问
Android界面控件(2)—注册点击事件监听器

Button和ImageButton 1.添加控件 1.打开Android项目下,res文件夹中的 layout 的 activity_main.xml 文件 2.可视化界面拖拽添加或修改 xml 文件代码添加 2.注册点击事件的监听器 (.xml 文件...

维他ViTa
2016/11/17
0
0
【菜鸟求助】Eclipse中,两个Activity,用其中一个Activity03调用另一个ResultActivity运行时提示**has stopped。请各位大神不吝赐教!

【新人求助】:一下是报错和源代码,请大神指出错误 orz333 ————————————————Activity03:———————————————— package com.example.activity03; import andro...

Honour_Lee
2016/05/30
506
13
深入解析Andoird事件分发机制

本文详细讲述了Android事件分发机制,包括事件源,事件,事件监听器的概念,现在整理出来分享给Android程序员兄弟们,希望给他们的开发工作带来帮助。 一、监听与回调 第一,要明白和事件相关的...

alunbar
2015/10/15
613
1
【android基础学习之一】——事件的监听与触发

之前一直准备开始学习Android,但是总是这事那事拖延了计划,最近决定一定要狠下心开始这段学习。 声明:学习的书籍《Android应用开发揭秘》,这里记录学习该书籍的日志,引用的相关代码与总...

晨曦之光
2012/03/08
396
0
自学Android 遇到个问题 求帮忙看看

自学Android 遇到个问题 不懂问题出在哪里 求帮忙看看 下边贴出代码 package com.example.activity_02; import android.app.Activity; import android.content.Intent; import android.os.B......

幻灭流殇
2015/01/20
179
2

没有更多内容

加载失败,请刷新页面

加载更多

Linux修改时区的正确方法【修改时间,需要修改软连接,靠谱】

CentOS和Ubuntu的时区文件是/etc/localtime,但是在CentOS7以后localtime以及变成了一个链接文件 [root@centos7 ~]# ll /etc/localtime lrwxrwxrwx 1 root root 33 Oct 12 11:01 /etc/loca......

Airship
47分钟前
0
0
《Netkiller Spring Cloud 手札》之 Master / Slave 主从数据库数据源配置

5.19.1. Master / Slave 主从数据库数据源配置 5.19.1.1. application.properties spring.datasource.master.driverClassName = com.mysql.cj.jdbc.Driverspring.datasource.master.url=j......

netkiller-
51分钟前
46
0
大数据(hadoop-HDFS的本地开发环境的配置与常见的HDFS的JAVA API)

HDFS的本地开发环境搭建 1:所需工具 1)hadoop2.7.3安装包 2)hadoop-eclipse-plugin插件 https://github.com/winghc/hadoop2x-eclipse-plugin 2:搭建过程 1:解压hadoop2.7.3文件2:下载...

这很耳东先生
今天
1
0
TCP协议的定义和丢包时的重传机制

TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节,...

tantexian
今天
2
0
图解Tomcat类加载机制(阿里面试题)

Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给commonClassLoader走双...

群星纪元
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部