Dialog在app中是很常见的,每次需要用到都去现创建是一件非常低效的方式。所以我封装了一个工具类,提供一些方法让开发者可以非常轻易地就能生成自己想要的样式的、并且功能完备的dialog,如:显示进度条对话框,或者dialog图标、标题、提示内容、按钮、单选列表、单选列表没有按钮、多选列表、使用自定义布局等等样式自由组合,并且提供操作对话框中点击事件的接口用于处理数据和页面变化等。
下面来看看主要代码:
dialog实现类BaseAchieveDialog.java主要代码:
/**
* 实现dialog样式设置的方法
*
* @param builder
*/
public void setStyle(AlertDialog.Builder builder) {
builder.setIcon(mDialogInfoBean.getDialogIcon());
builder.setTitle(mDialogInfoBean.getDialogTitle());
final String[] dialogListItems = mDialogInfoBean.getDialogListItems();
// 如果列表元素为空,或列表类型为空
if (dialogListItems == null
|| mDialogInfoBean.getDialogListType() == null) {
// 如果使用自定义的dialog布局
if (mDialogInfoBean.getDialogViewId() != 0) {
View view = LayoutInflater.from(mContext).inflate(
mDialogInfoBean.getDialogViewId(), null); // 自定义的dialog的布局
builder.setView(view);
} else { // dialog 1.没有使用列表样式,2.也没有使用自定义布局,则3.设置提示用户的信息,信息为空时该项将不显示
builder.setMessage(mDialogInfoBean.getDialogMessage());
}
} else { // dialog采用列表布局
creatList(builder, dialogListItems);
}
}
/**
* 创建dialog中的列表
*
* @param builder
* @param dialogListItems
* 保存列表元素的数组
*/
private void creatList(AlertDialog.Builder builder,
final String[] dialogListItems) {
switch (mDialogInfoBean.getDialogListType()) {
case CreateDialog.SINGLE_CHOICE_NO_BTN: // 单选列表,点击即代表确认,没有按钮
builder.setItems(dialogListItems, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (mICtrlDialogListener != null) {
// 因为没有按钮,点击就代表了确认,所以点击事件发生时直接将数据通过接口传递
mICtrlDialogListener.dialogOnClick(
dialogListItems[which], null);
}
}
});
break;
case CreateDialog.SINGLE_CHOICE: // 单选列表,点击代表选择,要确认或其他操作需要另外定义按钮
builder.setSingleChoiceItems(dialogListItems, 0,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 暂存到变量中
singleChoiceItem = dialogListItems[which];
}
});
break;
case CreateDialog.MULTI_CHOICE: // 多选列表,按钮需要另外定义
builder.setMultiChoiceItems(dialogListItems, null,
new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which,
boolean isChecked) {
if (isChecked) {
// 暂存到列表中
multiChoiceItems.add(dialogListItems[which]);
}
}
});
break;
default:
break;
}
}
/**
* 实现dialog按钮设置的方法
*
* @param builder
*/
public void setBtn(AlertDialog.Builder builder) {
String[] dialogBtnType = mDialogInfoBean.getDialogBtnTypes();
String[] dialogBtnName = mDialogInfoBean.getDialogBtnNames();
String[] dialogListItems = mDialogInfoBean.getDialogListItems();
// 如果按钮类型为空,或按钮名称为空,或(列表为单选无按钮类型并且列表元素不为空),则判定不生成按钮,此处什么都不做。
if ((dialogBtnType == null)
|| (dialogBtnName == null)
|| ((mDialogInfoBean.getDialogListType() == CreateDialog.SINGLE_CHOICE_NO_BTN) && (mDialogInfoBean
.getDialogListItems() != null))) {
} else if (dialogBtnType.length != dialogBtnName.length) { // 按钮类型和名称个数不匹配,不生成按钮
Toast.makeText(mContext, "dialog按钮的类型和个数不匹配!", Toast.LENGTH_SHORT)
.show();
} else if (dialogBtnType.length > 3) { // 按钮个数大于3个,不生成按钮
Toast.makeText(mContext, "dialog按钮个数应该不大于3个!", Toast.LENGTH_SHORT)
.show();
} else { // 生成按钮
for (int i = 0; i < dialogBtnType.length; i++) {
creatButton(builder, dialogBtnType, dialogBtnName,
dialogListItems, i);
}
}
}
/**
* 创建dialog的按钮
*
* @param builder
* @param dialogBtnType
* 按钮类型
* @param dialogBtnName
* 按钮名称
* @param dialogListItems
* 保存按钮名称的数组
* @param i
*/
private void creatButton(AlertDialog.Builder builder,
String[] dialogBtnType, String[] dialogBtnName,
final String[] dialogListItems, int i) {
switch (dialogBtnType[i]) {
case CreateDialog.POSITIVE: // 按钮类型,“确定”
builder.setPositiveButton(dialogBtnName[i], new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 如果列表元素为空,或列表的类型值为空,即为直接展示提示
if (dialogListItems == null
|| mDialogInfoBean.getDialogListType() == null) {
if (mICtrlDialogListener != null) {
mICtrlDialogListener.dialogOnClick(
CreateDialog.YES, null);
}
} else { // 列表元素和列表类型值都不为空时,则点击“确定”时保存与用户交互的数据
if (mICtrlDialogListener != null) {
if (mDialogInfoBean.getDialogListType() == CreateDialog.MULTI_CHOICE) {
mDialogInfoBean
.setMultiChoiceItems(multiChoiceItems);
mICtrlDialogListener.dialogOnClick(
CreateDialog.YES,
mDialogInfoBean.getMultiChoiceItems());
} else {
mICtrlDialogListener.dialogOnClick(
singleChoiceItem, null);
}
}
}
dialog.dismiss();
}
});
break;
case CreateDialog.NEGATIVE:
builder.setNegativeButton(dialogBtnName[i], new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
break;
case CreateDialog.NEUTRAL:
builder.setNeutralButton(dialogBtnName[i], new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
break;
default:
break;
}
}
/**
* 监听器
*/
private ICtrlDialogListener mICtrlDialogListener;
/**
* 为dialog的按钮设置点击监听器的方法
*
* @param mICtrlDialogListener
*/
public void setICtrlDialogListener(ICtrlDialogListener mICtrlDialogListener) {
if (mICtrlDialogListener != null) {
this.mICtrlDialogListener = mICtrlDialogListener;
}
}
进度条对话框实现类ProgressDialogUtil.java主要代码:
/**
* 实现初始化并显示进度条
* @param title 标题
* @param message 提示信息
* @param progressMax 要下载的文件的总数
*/
public void initProgress(String title, String message, int progressMax) {
if (mProgressDialog != null) {
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(false);
mProgressDialog.setCanceledOnTouchOutside(false);
mProgressDialog.setMax(progressMax);
mProgressDialog.setTitle(title);
mProgressDialog.setMessage(message);
mProgressDialog.show();
}
}
/**
* 实现更新进度条
* @param data
*/
public void updateProgress(int data) {
if (mProgressDialog != null) {
mProgressDialog.setProgress(data);
}
}
/**
* 当进度条已存在时,关闭进度条
*/
public void dismiss(){
if (mProgressDialog != null){
mProgressDialog.dismiss();
}
}
dialog封装类CreateDialog.java中封装了如下方法:
基础的dialog:
1.1 setBaseDialog(String dialogTitle, String dialogMessage);
1.3 showBaseDialog()
更多自定义的dialog:
2.1 setDialogStyle(int dialogViewId, int dialogIcon, String
dialogTitle, String dialogMessage, String dialogListType);
2.2 setDialogBtnName(String… dialogBtnNames);
2.3 setDialogBtnType(String… dialogBtnType);
2.4 setDialogListItems(String… dialogListItems);
2.6 showDialog()
设置按钮点击事件,调用接口
1.2 && 2.5 setICtrlDialogListener(ICtrlDialogListener
mICtrlDialogListener)
进度条对话框
3.1 initUpdateProgress(int maxLen, int currentLen)
3.2 setProgressUpdate(int maxLen, int currentLen)
3.3 closeProgressDialog()
这些封装的方法主要都是使用javabean的方式完成的,就是写入和获取操作,在此就不多说了。
更多Android开发技术一起探讨学习,点我 。
更多Android开发资源直接下载,点我 。