android学习笔记(48)android内部类作为事件监听类

文章标签: android,android事件
2015-1-22 11:32:19     人阅读    

android内部类作为事件监听类
         前面两个程序中所使用的事件监听器类都是内部类形式,使用内部类可以在当前类中复用该监听器类:因为监听器类是外部类的内部类,所以可以自由访问外部类的所有界面组件。 这也是内部类的两个优势。
         使用内部类来定义事件监听器类的例子可以参看前面的例子程序,此处不再赘述。
外部类作为事件监听器
        使用顶级类定义事件监听器类的形式比较少见,主要因为如下两个原因:
        1、事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。
        2、外部类形式的事件监听器不能自由访问创建GUI界面的类中的组件,编程不够简洁。 但如果某个事件监听器确实需要被多个GUI界面所共享,而且主要是完成某种业务逻辑的实现,则可以考虑使用外部类的形式来定义事件监听器类。下面的程序定义了一个外部类 作为OnLongClickListener类,该事件监听器实现了发送短信的功能。
程序清单:codes\03\3.2\SendSms\src\org\crazyit\event\SendSmsListener.java

package org.crazyit.event;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.EditText;
import android.widget.Toast;

public class SendSmsListener implements OnLongClickListener
{
 private Activity act;
 private EditText address;
 private EditText content;

 public SendSmsListener(Activity act, EditText address, EditText content)
 {
  this.act = act;
  this.address = address;
  this.content = content;
 }

 @Override
 public boolean onLongClick(View source)
 {
  String addressStr = address.getText().toString();
  String contentStr = content.getText().toString();
  SmsManager smsManager = SmsManager.getDefault();
  PendingIntent sentIntent = PendingIntent.getBroadcast(act, 0,
   new Intent(), 0);
  smsManager.sendTextMessage(addressStr, null, contentStr
   , sentIntent, null);
  Toast.makeText(act, "短信发送完成", Toast.LENGTH_LONG).show();
  return false;
 }
}

            上面的事件监听器类没有与任何GUI界面耦合,创建该监听器对象时需要传入两个 EditText对象和一个Activity对象,其中一个EditText用于作为收信人号码,一个EditText用于作为短信内容。


该程序的界面布局比较简单,故不给出界面布局文件,该程序的Java代码如下。
程序清单:SendSms\src\org\crazyit\event\SendSms.java

package org.crazyit.event;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;

public class SendSms extends Activity
{
 EditText address;
 EditText content;
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  //获取页面中收件人地址、短信内容
  address = (EditText)findViewById(R.id.address);
  content = (EditText)findViewById(R.id.content);
  Button bn = (Button)findViewById(R.id.send);
  bn.setOnLongClickListener(new SendSmsListener(
   this , address, content));
 }
}


         上面的程序中粗体字代码用于为指定按钮的长单击事件绑定监听器,当用户长单击界面 中的bn按钮时,程序将会触发SendSmsListener监听器,该监听器里包含的事件处理方法将 会向指定手机发送短信。

           此处我们使用模拟器来发送短信——不要指望能给你的女朋友发送短信,否则中国移动 要恼火了。该程序只能向另一台模拟器发送短信,比如我们执行如下命令来启动另一台模拟 器(直接使用abc镜像文件来启动模拟器):
emulator -data abc
启动完成后可以在模拟器窗U的标题上看到该模拟器的号码


            实际上我们不推荐将业务逻辑实现写在事件监听器中,包含业务逻辑的事件 监听器将导致程序的显示逻辑和业务逻辑搞合,从而增加程序后期的维护难度。如 果确实有多个实现监听器需要实现相同的业务逻辑功能,可以考虑使用业务逻辑组 件来定义业务逻辑功能,再让事件监听器来调用业务逻辑组件的业务逻辑方法。


原文地址:http://www.itmmd.com/201501/537.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

android学习笔记(49)android Activity本身作为事件监听类   上一篇
下一篇  数字格式化问题 Android 5.0
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!