使用外部类定义事件监听器类的形式比较少见,主要因为如下两个原因。
~事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。
~外部类形式的事件监听器不能自由访问创建GUI界面的类中的组件,编程不够简洁。
但如果某个事件监听器确实需要被多个GUI界面所共享,而且主要是完成某种业务逻辑的事件,则可以考虑使用外部类形式来定义事件监听器类。
下面的程序定义了一个外部类作为OnLongClickListener类,该事件监听器实现了发送短信的功能。
package com.example.lu.eventqs; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.telephony.SmsManager; import android.view.View; import android.widget.EditText; import android.widget.Toast; /** * Created by lu on 2016/3/29. */ public class SendSmsListener implements View.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 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; } }
该程序的界面布局文件如下。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.example.lu.eventqs.MainActivity" tools:showIn="@layout/activity_main" android:orientation="vertical" android:gravity="fill_horizontal"> <EditText android:id="@+id/address" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请填写收信号码" /> <EditText android:id="@+id/content" android:layout_width="match_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代码如下。
public class MainActivity extends AppCompatActivity { EditText address; EditText content; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); //获取页面中收件人地址、短信内容 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)); }运行如下。