学习目的:
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提供的抽象类的匿名实现:
复制代码 代码如下:
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
button btn = (button)findviewbyid(r.id.btnok);
//绑定匿名的监听器,并执行您所要在点击按钮后执行的逻辑代码
btn.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view arg0) {
// todo auto-generated method stub
toast.maketext(myactivity.this, "点击了按钮", toast.length_long).show();
}
});
}
总结:
本文介绍了如何使用android中button的方法,并着重介绍了事件监听器的设计目的、运行流程和使用方法。