基于监听的事件处理——外部类作为事件监听器类
使用内部类定义事件监听器类的形式比较少见,主要因为如下两个原因:
- 事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。
- 外部类形式的事件监听器不能自由访问创建GUI界面的类中的组件,编程不够简洁。
但如果某个事件监听器确实需要被多个GUI界面所共享,而且主要是完成某种业务逻辑的实现,则可以考虑使用外部类的形式来定义事件监听器类。下面的程序定义了一个外部类作为OnLongClickListener类,该事件监听器实现了发送短信的功能。
package com.example.studyevent; 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{ public 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) { // TODO Auto-generated method stub String addressStr=address.getText().toString(); String contentStr=content.getText().toString(); //获取短信管理器 SmsManager smsManager=SmsManager.getDefault(); //创建发送短信的PendingIntent 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用于作为短信内容。
该程序的界面布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:gravity="fill_horizontal" tools:context=".SendSmsActivity" > <EditText android:id="@+id/address" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请填写收信号码" /> <EditText android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请填写短信内容" android:lines="3" /> <Button android:id="@+id/send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="发送" /> </LinearLayout>
该程序的Java代码如下:
package com.example.studyevent; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.Button; import android.widget.EditText; public class SendSmsActivity extends Activity { EditText address; EditText content; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_send_sms); //获取页面中收件人地址、短信内容 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)); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.send_sms, menu); return true; } }
上面的程序中粗体字代码用于为指定按钮的长单击事件绑定监听器,当用户长单击界面中的bn按钮时,程序将会触发SendSmsListener监听器,该监听器里包含的事件处理方法将会向指定手机发短信。
此处使用模拟器来发送短信——不要指望能给你的女朋友发送短信,否则中国移动要恼火了。该程序只能向另一台模拟器发送短信,比如执行如下命令来启动另一台模拟器(直接使用abc镜像文件来启动模拟器)
emulator -avd abc
运行程序将出现如下效果:
发送短信界面
接收短信界面: