`
ssfeng
  • 浏览: 1428 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

定制自己的 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);

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics