当前位置: 代码迷 >> Android >> 定做自己的 Android Dialog 信息提示对话框
  详细解决方案

定做自己的 Android Dialog 信息提示对话框

热度:61   发布时间:2016-05-01 19:15:56.0
定制自己的 Android Dialog 信息提示对话框

看了不少网上关于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				信息提示内容	 * @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);

?

?

  相关解决方案