看了不少网上关于Android对话框的应用,下面的比较全

http://www.linuxidc.com/Linux/2011-07/39227.htm

发现一些问题,似乎都没有怎么讨论其中事件的参数说明,看api文档描述似乎也很简单。

但是应用时,经常会需要得到按钮按下去后的某些返回值,需要根据情况执行事件。

网上的代码通常是这样:

AlertDialog.Builder builder = new AlertDialog.Builder(activity);builder.setTitle(title);builder.setMessage(msg);builder.setPositiveButton("OK",new DialogInterface.OnClickListener()   {   public void onClick(DialogInterface dialoginterface, int i)        {//Click event     }});builder.create().show();

不喜欢这样的调用方式,每次调用还得逐步创建,而且事件还得在对话框里面实现,还有返回值问题也没提到。还是习惯了C#的MessageBox.Show(msg)这种方式,还能有效判断按了哪个按钮。

所以决定定制自己的对话框类,用以解决以上的问题。

直接返回值基本很难,毕竟java的解决方式不同,那么就干脆做成直接执行不同类型的事件方法好了。

首先是定义事件侦听接口:IMessageDialogListener

public interface IMessageDialogListener {public void onDialogClickOk(int requestCode);public void onDialogClickCancel(int requestCode);public void onDialogClickClose(int requestCode);}//end interface

该接口里定义确定、取消、关闭按钮的事件。在主程序中,直接实现它,也就相当于根据返回值执行事件了。

其中,requestCode 是对话框返回的激活ID。

当一个Activity激活多个对话框时,可以传入不同的激活ID,可以任意指定。在对话框的按钮点击后,则返回此ID,那么Activity在实现此接口时,就可以根据这个ID来判断是哪个对话框的返回,以执行对应的事件方法。

接下来就是自己定制的信息提示对话框类:MessageDialog

代码如下:

package com.ricorocksoft.Control;import java.math.BigDecimal;import java.util.Date;import com.ricorocksoft.IDebug;import com.ricorocksoft.Util.ConvertUtil;import android.app.Activity;import android.app.AlertDialog.Builder;import android.content.DialogInterface;import android.view.Gravity;import android.widget.Toast;/** *  * 通用普通式 Message Dialog 信息对话框显示类 * 用于显示通用的普通式样的信息对话框  *  * @author Michael * */public class MessageDialog {private String sCaptionClose="关闭";private String sCaptionOk="确定";private String sCaptionCancel="取消";private int iIcoResourceId=-1;private Activity activity=null;public String getCaptionClose() {return sCaptionClose;}public void setCaptionClose(String sCaptionClose) {this.sCaptionClose = sCaptionClose;}public String getCaptionOk() {return sCaptionOk;}public void setCaptionOk(String sCaptionOk) {this.sCaptionOk = sCaptionOk;}public String getCaptionCancel() {return sCaptionCancel;}public void setCaptionCancel(String sCaptionCancel) {this.sCaptionCancel = sCaptionCancel;}public int getIcoResourceId() {return iIcoResourceId;}public void setIcoResourceId(int iIcoResourceId) {this.iIcoResourceId = iIcoResourceId;}//-----------------------------------------------------------------------public MessageDialog(Activity activity) {this.activity=activity;}//-----------------------------------------------------------------------/** * 显示带有标题的提示信息对话框 * 该对话框仅带有一个“关闭”按钮 *  * @param requestCode激活ID号 * @param title信息提示标题 * @param message信息提示内容 * @param listener对话框按键点击事件侦听对象 */public void ShowInfo(int requestCode,String title,String message,IMessageDialogListener listener){Builder builder = CreateDialogBuilder(title,message);if(listener!=null){builder.setPositiveButton(sCaptionClose ,new DialogOnClickListener(requestCode, 0, listener));}else{builder.setPositiveButton(sCaptionClose ,null);}builder.create().show();}/** * 显示带有标题的提示信息对话框 * 该对话框仅带有一个“关闭”按钮 * 默认激活ID号为888888 *  * @param title信息提示标题 * @param messager信息提示内容 */public void ShowInfo(String title,String messager){ShowInfo(888888,title,messager,null);}/** * 显示不含标题的提示信息对话框 * 该对话框仅带有一个“关闭”按钮 * 默认激活ID号为888888 *  * @param messager信息提示内容 */public void ShowInfo(String messager){ShowInfo(888888,"",messager,null);}/** * 显示带有标题的确认信息对话框 * 该对话框带有“确认”和“取消”两个按钮 *  * @param requestCode激活ID号 * @param title信息提示标题 * @param message信息提示内容 * @param listener对话框按键点击事件侦听对象 */public void ShowConfirm(int requestCode,String title,String message,IMessageDialogListener listener){Builder builder = CreateDialogBuilder(title,message);if(listener!=null){builder.setPositiveButton(sCaptionOk ,new DialogOnClickListener(requestCode, 1, listener));builder.setNegativeButton(sCaptionCancel ,new DialogOnClickListener(requestCode, 2, listener));}else{builder.setPositiveButton(sCaptionOk ,null);builder.setPositiveButton(sCaptionCancel ,null);}builder.create().show();}//----------------------------------------------------------------------------------------------------------------/** * 创建对话框Android的AlertDialog.Builder对象 *  * @param title信息提示标题 * @param message信息提示内容 * @returnAlertDialog.Builder对象 */public android.app.AlertDialog.Builder CreateDialogBuilder(String title,String message){android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(activity);builder.setTitle(title);builder.setMessage(message);if(this.iIcoResourceId!=-1){builder.setIcon(this.iIcoResourceId);}return builder;}//----------------------------------------------------------------------------------------------------------------/** * 以Toast的方式显示提示信息 * 该Toast不含任何按钮 *  * @param message提示信息 */public void ShowToast(String message){Toast t =null;   t = Toast.makeText(this.activity, message, Toast.LENGTH_LONG);   t.setGravity(Gravity.CENTER, 0, 0);   t.show();}//----------------------------------------------------------------------------------------------------------------private class DialogOnClickListener implements DialogInterface.OnClickListener{private int requestCode;private int clickid=0;private IMessageDialogListener listener;public DialogOnClickListener(int requestCode,int clickid,IMessageDialogListener listener){this.requestCode=requestCode;this.clickid=clickid;this.listener=listener;}@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubif(this.listener!=null){switch(this.clickid){case 0:this.listener.onDialogClickClose(this.requestCode);break;case 1:this.listener.onDialogClickOk(this.requestCode);break;case 2:this.listener.onDialogClickCancel(this.requestCode);break;}}}}//end class//----------------------------------------------------------------------------------------------------------------}//end class

这个自定的MessageDialog,算是一个框架,主要实现了基本提示信息的对话框显示,所以里面生成的对话框,只是基本的提示信息对话框,并不包含其他选择项、列表等其他形式的对话框,但至少是个框架,其他的以后再此基础上扩展或继承就可以了。

在这个类中,还包含了一个私有的DialogOnClickListener 类,它实现了DialogInterface.OnClickListener接口。

该类的目的是维持一个传入的激活ID(requestCode),并且根据点击类型(clickid),将对话框中的按钮onClick事件,转化成点击“确定”、“取消”、“关闭”这几个按钮对应的具体事件,也就是对应执行 IMessageDialogListener 接口,并且将传入的激活ID,再返回给IMessageDialogListener。

应用时,在主程序Activity中实例化:

MessageDialog dialog=new MessageDialog(this);

主程序Activity中就可以简单直接的调用了,例如:

            dialog.ShowConfirm(10, "test1", "aaaa", this);            dialog.ShowConfirm(11, "test2", "bbbb", this);            dialog.ShowConfirm(13, "test2", "cccc", this);                        dialog.ShowInfo("aaaa");

至于ShowConfirm显示确认对话框,用户选择点击按钮后,执行的对应事件,那么就可以在Activity中,实现IMessageDialogListener接口,在里面onDialogClickOk方法里,放置对应的处理逻辑。

主程序Activity可以直接实现IMessageDialogListener接口,例如:

@Overridepublic void onDialogClickOk(int requestCode) {// TODO Auto-generated method stubswitch(requestCode){case 10:dialog.ShowToast("This the 1 Ok"+requestCode);break;case 11:dialog.ShowToast("This the 2 Ok"+requestCode);break;case 12:dialog.ShowToast("This the 3 Ok"+requestCode);break;}}@Overridepublic void onDialogClickCancel(int requestCode) {// TODO Auto-generated method stubdialog.ShowToast("Cnacle"+requestCode);}@Overridepublic void onDialogClickClose(int requestCode) {// TODO Auto-generated method stubdialog.ShowToast("Close"+requestCode);}   

当然,也可以自己定义其他的类实现IMessageDialogListener接口,例如 myListener1,myListener2,myListener3....不同的Listener处理不同的事务逻辑。

对话框的调用,就可以改成:

           dialog.ShowConfirm(10, "test1", "aaaa", myListener1);            dialog.ShowConfirm(11, "test2", "bbbb", myListener2);            dialog.ShowConfirm(13, "test2", "cccc", myListener3);

更多相关文章

  1. Android自动化测试框架开发(二)Monkey、MonkeyRunner介绍和分析
  2. quick-cocos2d-x android返回键监听并实现原生退出对话框
  3. Android使用AccessibilityService实现USB扫码枪数据抓取
  4. Android(安卓)之 下拉框(Spinner)的使用
  5. Android(安卓)多个Activity之间的跳转 超级简单例子
  6. Android开发历程_13(Service的使用)
  7. 1.5 Button
  8. Android应用的自动升级、更新模块的实现
  9. Android(安卓)创建自定Dialog

随机推荐

  1. Android一键锁屏代码
  2. android 四大组件之Service
  3. android中的xml处理
  4. Android 常用dialog提示对话框
  5. Android(安卓)8.1 开机流程分析(1)
  6. Android入门(9)AudioRecord和AudioTrack类
  7. Android开发中出现Attempt to invoke vir
  8. Android 入门知识点梳理之一 四大组件
  9. Android(安卓)之Content Provider(URI)存储
  10. 初学Android,开机自启动的Service(七十三