按钮和文本框算是比较简单的控件了,以下主要讲按钮的事件响应,三种写法(匿名内部类响应事件、外部类响应事件、本类直接响应事件)
点击按钮后文本框中会显示 ”按钮被单击了”,先看效果:
以下是这个界面的布局文件:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <Button 8 android:id="@+id/button1" 9 android:layout_width="match_parent" 10 android:layout_height="wrap_content" 11 android:text="点我" /> 12 13 <TextView 14 android:id="@+id/textView1" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:hint="等待单击" /> <!-- 默认未被单击时的提示信息 --> 18 19 </LinearLayout>
首先看第一种匿名内部类写的监听事件处理方式:
1 package com.example.helloworld; 2 3 4 import android.app.Activity; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 import android.widget.TextView; 10 11 12 public class MainActivity extends Activity { 13 14 private Button btn1; //声明按钮对象 15 private TextView tv1; //声明文本框对象 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.myactivity_main); 21 22 //以下代码以匿名内部内的方式处理按钮click事件 23 24 //初始化两个控件对象的实例,学过MFC的是不是很熟悉,和GetDlgItem api类似的道理了 25 btn1 = (Button) findViewById(R.id.button1); 26 tv1 = (TextView) findViewById(R.id.textView1); 27 28 //这里设置按钮被Click时的处理函数,是new一个OnClickListener的匿名内部类来实现的 29 btn1.setOnClickListener(new OnClickListener() { 30 31 //重载了OnClickListener接口的onClick方法,处理被占击后的事件 32 @Override 33 public void onClick(View v) { 34 // TODO Auto-generated method stub 35 tv1.setHint("按钮被单击了"); 36 } 37 }); 38 } 39 }
再看外部类的写法,其实很简单了,就再加个类而已:
1 package com.example.helloworld; 2 3 4 import android.app.Activity; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 import android.widget.TextView; 10 11 12 public class MainActivity extends Activity { 13 14 private Button btn1; //声明按钮对象 15 private TextView tv1; //声明文本框对象 16 17 //这里声明了一个方法可以访问到TextView的对象 18 public TextView getTv1() { 19 return tv1; 20 } 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.myactivity_main); 26 27 //以下代码以外部类的方式处理按钮click事件 28 29 //初始化两个控件对象的实例,学过MFC的是不是很熟悉,和GetDlgItem api类似的道理了 30 btn1 = (Button) findViewById(R.id.button1); 31 tv1 = (TextView) findViewById(R.id.textView1); 32 33 //这里采用外部类MyOnClick实现事件处理 34 btn1.setOnClickListener(new MyOnClick(this)); 35 } 36 } 37 38 39 //外部类,实现OnClickListener接口 40 class MyOnClick implements OnClickListener { 41 42 private MainActivity baseActivity; 43 44 //该构造函数的作用主要用于访问到TextView对象 45 public MyOnClick(MainActivity mt) { 46 baseActivity = mt; 47 } 48 49 @Override 50 public void onClick(View v) { 51 // TODO Auto-generated method stub 52 baseActivity.getTv1().setHint("按钮被单击了"); 53 } 54 }
最后是activity类直接继承接口并实现事件响应,也是简单:
1 package com.example.helloworld; 2 3 4 import android.app.Activity; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 import android.widget.TextView; 10 11 12 //本类直接实现接口OnClickListener 13 public class MainActivity extends Activity implements OnClickListener { 14 15 private Button btn1; //声明按钮对象 16 private TextView tv1; //声明文本框对象 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.myactivity_main); 22 23 //以下代码以本类直接实现接口的方式处理按钮click事件 24 25 //初始化两个控件对象的实例,学过MFC的是不是很熟悉,和GetDlgItem api类似的道理了 26 btn1 = (Button) findViewById(R.id.button1); 27 tv1 = (TextView) findViewById(R.id.textView1); 28 29 //这里因为是本类直接实现接口,直接给this指针就是了 30 btn1.setOnClickListener(this); 31 } 32 33 @Override 34 public void onClick(View v) { 35 // TODO Auto-generated method stub 36 tv1.setHint("按钮被单击了"); 37 } 38 }
好了,处理按钮的OnClick事件上面只是实现了三种Java的写法而已,没什么技术含量,同理该按钮的其它事件也可以像上面一样处理。