
我们这一节将简单的Button事件响应综合提示控件Toast的应用,今天我们来学习Button如何实现事件响应?Button按钮所触发的事件处理,我们称之为Event Handle,只不过在Android当中,按钮事件是由系统的Button.OnClickListener所控制,熟悉Java程序设计的读者对OnXxxListener应该不陌生。以下的Demo,我们将实现当点击Button时,TextView文字将发生改变,并在屏幕上出现一段时间的Toast提醒。让我们看一下效果图:点击按钮前:点击按钮后:我们主要在程序里改了两处地方一处是main.xml 另一处是ButtonDemo.java,Main.xml 代码如下:代码片段,双击复制。
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" //1.5以后默认的是LinearLayout布局
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/textview1" //定义Id方便Java类找到它,并且控制它
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/button1"
android:layout_width="60px"
android:layout_height="wrap_content" android:layout_gravity="right" //让Button放在右面
android:text="确定"/>
</LinearLayout>
|
Button.java 代码如下:
代码片段,双击复制
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package com.android.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class ButtonDemo extends Activity {
private TextView textview1;
private Button button1;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//通过ID在找到定义在main.xml里的TextView和Button控件
textview1 = (TextView)findViewById(R.id.textview1);
button1 = (Button)findViewById(R.id.button1);
//增加事件响应 button1.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v)
{
//Toast提示控件
Toast.makeText(ButtonDemo.this,
"TextView里的文字发生了改变,你注意到了吗?",
Toast.LENGTH_LONG).show();
//将TextView的文字发生改变
textview1.setText("欢迎来到魏祝林的博客!");
}
});
}
}
|
第一种:匿名内部类作为事件监听器类大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件器更合适,实际上,这种形式是目前是最广泛的事件监听器形式。上面的程序代码就是匿名内部类来创建事件监对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java作为监听器。第二种:内部类作为监听器将事件监听器类定义成当前类的内部类。使用内部类可以在当前类中复用监听器类,因为监听器类是外部类内部类的两个优势。上面代码就是内部类的形式!第三种:Activity本身作为事件监听器这种形式使用activity本身作为监听器类,可以直接在activity类中定义事件处理器方法,这种形式非常简洁Activity的主要职责应该是完成界面初始化;但此时还需包含事件处理器方法,从而引起混乱。(2)如果act上面的程序让Activity类实现了OnClickListener事件监听接口,从而可以在该Activity类中直接定义事件处象时,直接使用this作为事件监听器对象即可。
第四种:外部类作为监听器 ButtonTest类 使用顶级类定义事件监听器类的形式比较少见,主要因为如下 两个原因:1、事件监听器通常属于特定的gui界面,定义成外部类不篮球提高程序的内聚性。 2、外部类形式的事件监听器不能自由访问创建gui界面的类中的组件,编程不够简洁。 但如果某个事件监听器确实需要被多个gui界面所共享,而且主要是完成某种业务逻辑的实现,则可以考虑使用。第五种:直接绑定到标签Android还有一种更简单的绑定事件监听器的的方式,直接在界面布局文件中为指定标签绑定事件处理方法。对于很多Android标签而言,它们都支持如onClick、onLongClick等属性,这种属性的属性值就是一个形如x(View source) 的方法的方法名。在布局文件中为button添加属性,如一代码:
为Button按钮绑定一个事件处理方法:clickHanlder,这意味着开发者需要在该界面布局对应的Activity中定处理该按钮上的单击事件。 下面是该界面布局对应的java代码:

