在Android中很多操作后都要调用一个对话框,所以封装了一个方法,大体如下:
protected void alertDialog(Context mContext, String title, String message)
{
// 构造对话框
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(title);
builder.setMessage(message);
// 确定
builder.setPositiveButton(R.string.i_know, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
Dialog noticeDialog = builder.create();
noticeDialog.show();
}
一个典型的 alert 对话框,但有时的可能需求:当用户点击确定按钮后,还需要做点其他的事情,所以我想在 参数当中传递一个对象过来,在click后调用其中的方法,我试着写了一个类:
class DialogButton{
String bt2 = "";
public void ok(){
}
public void cancel(){}
}
然后把之前的方法改成这样;
protected void alertDialog(Context mContext, String title, String message, final DialogButton button)
{
// 构造对话框
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(title);
builder.setMessage(message);
// 确定
builder.setPositiveButton(R.string.i_know, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
button.ok();
dialog.dismiss();
}
});
Dialog noticeDialog = builder.create();
noticeDialog.show();
}
后面调用的时候重写 DialogButton 这里面的方法,因为 alertDialog中 变成了 final DialogButton,所以传过来无效,请问大侠们有什么好的方法 ?
可以参考一下我这个写法,这是一个简单的通用消息提示框,模仿了.NET的MessageBox。
MessageBox.show(this, getString(R.string.save_confirm), MessageBox.Buttons.YesNo, new MessageBox.OnClickListener() {
@Override
public void onYesClick(DialogInterface dialog, int which) {
// TODO
}
});
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
/**
* Created by JianyingLi on 15/2/5.
*/
public class MessageBox {
public enum Buttons {
AbortRetryIgnore, // 消息框包含“中止”、“重试”和“忽略”按钮。
OK, // 消息框包含“确定”按钮。
OKCancel, // 消息框包含“确定”和“取消”按钮。
RetryCancel, // 消息框包含“重试”和“取消”按钮。
YesNo, // 消息框包含“是”和“否”按钮。
YesNoCancel, // 消息框包含“是”、“否”和“取消”按钮。
}
public static AlertDialog show(Activity activity, int resId) {
return show(activity, activity.getString(resId));
}
/**
* 消息、确认(无事件处理)
*
* @param activity
* @param msg
*/
public static AlertDialog show(Activity activity, String msg) {
return show(activity, msg, null, Buttons.OK, null);
}
/**
* 消息、确认(有事件处理)
*
* @param activity
* @param msg
* @param listener1 onOKClick
*/
public static AlertDialog show(Activity activity, String msg, OnClickListener listener1) {
return show(activity, msg, null, Buttons.OK, listener1);
}
/**
* 标题、消息、确认(无事件处理)
*
* @param activity
* @param msg
* @param title
*/
public static AlertDialog show(Activity activity, String msg, String title) {
return show(activity, msg, title, Buttons.OK, null);
}
/**
* 标题、消息、确认(有事件处理)
*
* @param activity
* @param msg
* @param title
* @param listener1 onOKClick
*/
public static AlertDialog show(Activity activity, String msg, String title, OnClickListener listener1) {
return show(activity, msg, title, Buttons.OK, listener1, null, null);
}
/**
* 消息,自定义按钮
*
* @param activity
* @param msg
* @param buttons
* @param clickListener
* @return
*/
public static AlertDialog show(Activity activity, String msg, final Buttons buttons, final OnClickListener clickListener) {
return show(activity, msg, null, buttons, clickListener, null, null);
}
public static AlertDialog show(Activity activity, String msg, String title, final Buttons buttons, final OnClickListener clickListener) {
return show(activity, msg, title, buttons, clickListener, null, null);
}
public static AlertDialog show(Activity activity, String msg, String title, final Buttons buttons, final OnClickListener clickListener, final DialogInterface.OnShowListener onShowListener, final DialogInterface.OnDismissListener onDismissListener) {
final DialogInterface.OnClickListener listener1 = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (clickListener == null) return;
switch (buttons) {
case AbortRetryIgnore:
clickListener.onAbortClick(dialog, which);
break;
case OK:
case OKCancel:
clickListener.onOKClick(dialog, which);
break;
case RetryCancel:
clickListener.onRetryClick(dialog, which);
break;
case YesNo:
case YesNoCancel:
clickListener.onYesClick(dialog, which);
break;
}
}
};
final DialogInterface.OnClickListener listener2 = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (clickListener == null) return;
switch (buttons) {
case AbortRetryIgnore:
clickListener.onRetryClick(dialog, which);
break;
case YesNoCancel:
clickListener.onNoClick(dialog, which);
break;
}
}
};
final DialogInterface.OnClickListener listener3 = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (clickListener == null) return;
switch (buttons) {
case AbortRetryIgnore:
clickListener.onIgnoreClick(dialog, which);
break;
case OKCancel:
case RetryCancel:
case YesNoCancel:
clickListener.onCancelClick(dialog, which);
break;
case YesNo:
clickListener.onNoClick(dialog, which);
break;
}
}
};
AlertDialog d = null;
AlertDialog.Builder b = new AlertDialog.Builder(activity);
if (msg != null && msg.trim().length() > 0) {
b.setMessage(msg);
}
if (title != null && title.trim().length() > 0) {
b.setTitle(title);
}
switch (buttons) {
case AbortRetryIgnore:
b.setPositiveButton(R.string.msg_box_abort, listener1); // Abort
b.setNeutralButton(R.string.msg_box_retry, listener2); // Retry
b.setNegativeButton(R.string.msg_box_ignore, listener3); // Ignore
break;
case OK:
b.setPositiveButton(R.string.msg_box_ok, listener1); // OK
break;
case OKCancel:
b.setPositiveButton(R.string.msg_box_ok, listener1); // OK
b.setNegativeButton(R.string.msg_box_cancel, listener3); // Cancel
break;
case RetryCancel:
b.setPositiveButton(R.string.msg_box_retry, listener1); // Retry
b.setNegativeButton(R.string.msg_box_cancel, listener3); // Cancel
break;
case YesNo:
b.setPositiveButton(R.string.msg_box_yes, listener1); // Yes
b.setNegativeButton(R.string.msg_box_no, listener3); // No
break;
case YesNoCancel:
b.setPositiveButton(R.string.msg_box_yes, listener1); // Yes
b.setNeutralButton(R.string.msg_box_no, listener2); // No
b.setNegativeButton(R.string.msg_box_cancel, listener3); // Cancel
break;
}
d = b.create();
d.setOnShowListener(onShowListener);
d.setOnDismissListener(onDismissListener);
d.show();
return d;
}
public static abstract class OnClickListener {
public void onAbortClick(DialogInterface dialog, int which) {
}
public void onRetryClick(DialogInterface dialog, int which) {
}
public void onIgnoreClick(DialogInterface dialog, int which) {
}
public void onOKClick(DialogInterface dialog, int which) {
}
public void onCancelClick(DialogInterface dialog, int which) {
}
public void onYesClick(DialogInterface dialog, int which) {
}
public void onNoClick(DialogInterface dialog, int which) {
}
}
}
如果想后期可以重写,你在这里可以将DialogButton设置成一个接口啊。然后在调用函数传入这个参数的时候(也就是新建DialogButton的时候),来自定义dialogbutton的ok函数和cancel函数的具体实现啊。类似于这样:
public void click(View view) {
alertDialog(this, "test", "this is a test", new DialogButton() {
@Override
public void ok() {
Log.d(TAG, "ok");
}
@Override
public void cancel() {
Log.d(TAG, "cancel");
}
});
}
protected void alertDialog(Context mContext, String title, String message, final DialogButton button)
{
// 构造对话框
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(title);
builder.setMessage(message);
// 确定
builder.setPositiveButton(R.string.i_know, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
button.ok();
dialog.dismiss();
}
});
Dialog noticeDialog = builder.create();
noticeDialog.show();
}
public abstract class BaseAlertDialog extends AlertDialog {
protected Context mContext;
public BaseAlertDialog(Context context) {
super(context);
mContext = context;
}
public BaseAlertDialog(Context context, int theme) {
super(context, theme);
mContext = context;
}
public abstract int getLayoutRes();
public abstract void initViews(View convertView);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = getLayoutInflater().inflate(getLayoutRes(), null);
setContentView(view);
initViews(view);
}
public BaseAlertDialog showDialog(){
show();
return this;
}
}
修改初始化方法传入值即可