精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-03
看了不少网上关于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
该接口里定义确定、取消、关闭按钮的事件。在主程序中,直接实现它,也就相当于根据返回值执行事件了。 其中,irequestCode 是对话框返回的激活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 信息提示内容 * @return AlertDialog.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; } @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub if(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接口,例如: @Override public void onDialogClickOk(int requestCode) { // TODO Auto-generated method stub switch(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; } } @Override public void onDialogClickCancel(int requestCode) { // TODO Auto-generated method stub dialog.ShowToast("Cnacle"+requestCode); } @Override public void onDialogClickClose(int requestCode) { // TODO Auto-generated method stub dialog.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);
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-11-06
我有问题,你这种本质上还是用的的 builder.create().show() 方式创建对话框,但是这种方式创建会有问题的,不信你可以弄个progressdialog一直显示,然后翻转android手机方向侧放,必定崩溃后台logcat报leaked window错误。
正确的方式是showDialog(int),然后activity实现oncreatedialog。 所以…… |
|
返回顶楼 | |
发表时间:2011-11-07
AlertDialog.builder能做的事情优先,真正想做出自己的效果,还是用Dialog,通过layout的方式来定制。
楼主的方法只能说简化了一些操作,供人参考。 |
|
返回顶楼 | |
发表时间:2011-11-07
qiii2006 写道 我有问题,你这种本质上还是用的的 builder.create().show() 方式创建对话框,但是这种方式创建会有问题的,不信你可以弄个progressdialog一直显示,然后翻转android手机方向侧放,必定崩溃后台logcat报leaked window错误。
正确的方式是showDialog(int),然后activity实现oncreatedialog。 所以…… 是的,本质上并没改变创建方式的。 不过谢了,你说的有道理,迟点我试下这种方式创建!:)) |
|
返回顶楼 | |
发表时间:2011-11-07
earth502 写道 AlertDialog.builder能做的事情优先,真正想做出自己的效果,还是用Dialog,通过layout的方式来定制。
楼主的方法只能说简化了一些操作,供人参考。 写的这个重点并不是定制dialog的效果,本身的目的也只是抽象成公用的类库,这样在其他项目里很方便的调用。 |
|
返回顶楼 | |
发表时间:2011-11-07
ssfeng 写道 qiii2006 写道 我有问题,你这种本质上还是用的的 builder.create().show() 方式创建对话框,但是这种方式创建会有问题的,不信你可以弄个progressdialog一直显示,然后翻转android手机方向侧放,必定崩溃后台logcat报leaked window错误。
正确的方式是showDialog(int),然后activity实现oncreatedialog。 所以…… 是的,本质上并没改变创建方式的。 不过谢了,你说的有道理,迟点我试下这种方式创建!:)) 这是因为翻转后要重绘activity,引用出错了 |
|
返回顶楼 | |
发表时间:2011-11-09
qiii2006 写道 我有问题,你这种本质上还是用的的 builder.create().show() 方式创建对话框,但是这种方式创建会有问题的,不信你可以弄个progressdialog一直显示,然后翻转android手机方向侧放,必定崩溃后台logcat报leaked window错误。
正确的方式是showDialog(int),然后activity实现oncreatedialog。 所以…… 好像有个叫做onActivityDestroy的回调方法。实现这个方法可以在activity销毁的时回收对话框 |
|
返回顶楼 | |
发表时间:2011-11-10
还是有收获的
|
|
返回顶楼 | |
发表时间:2011-11-14
只是向上又封装了一层 本质上创建Dialog的方式没变
|
|
返回顶楼 | |
浏览 10929 次