基于监听的事件处理——外部类作为事件监听器类

       使用内部类定义事件监听器类的形式比较少见,主要因为如下两个原因:

  • 事件监听器通常属于特定的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

      运行程序将出现如下效果:

发送短信界面

   接收短信界面:  

 

     

posted @ 2013-11-04 16:55  TealerProg  Views(927)  Comments(0Edit  收藏  举报