android 点击对话框按钮 不关闭按钮,如何防止单击按钮时对话框关闭

我编写了一个简单的类(AlertDialogBuilder),您可以使用它在按对话框按钮时禁用自动关闭功能。

它也与Android1.6兼容,所以它不使用OnShowListener(它只有API>=8可用)。

因此,您可以使用这个CustomAlertDialogBuilder,而不是使用AlertDialog.Builder。最重要的是你不应该打电话给创建(),但只有显示()方法。我增加了如下方法setCanceledOnTouchOutside()和setOnDismissListener这样您仍然可以直接在构建器上设置它们。

我在Android1.6、2.x、3.x和4.x上测试了它,所以它应该运行得很好。如果你发现一些问题,请在这里评论。package com.droidahead.lib.utils;import android.app.AlertDialog;import android.content.Context;

import android.content.DialogInterface;import android.view.View;import android.view.View.OnClickListener;

ublic class CustomAlertDialogBuilder extends AlertDialog.Builder {

/**

* Click listeners

*/

private DialogInterface.OnClickListener mPositiveButtonListener = null;

private DialogInterface.OnClickListener mNegativeButtonListener = null;

private DialogInterface.OnClickListener mNeutralButtonListener = null;

/**

* Buttons text

*/

private CharSequence mPositiveButtonText = null;

private CharSequence mNegativeButtonText = null;

private CharSequence mNeutralButtonText = null;

private DialogInterface.OnDismissListener mOnDismissListener = null;

private Boolean mCancelOnTouchOutside = null;

public CustomAlertDialogBuilder(Context context) {

super(context);

}

public CustomAlertDialogBuilder setOnDismissListener (DialogInterface.OnDismissListener listener) {

mOnDismissListener = listener;

return this;

}

@Override

public CustomAlertDialogBuilder setNegativeButton(CharSequence text, DialogInterface.OnClickListener listener) {

mNegativeButtonListener = listener;

mNegativeButtonText = text;

return this;

}

@Override

public CustomAlertDialogBuilder setNeutralButton(CharSequence text, DialogInterface.OnClickListener listener) {

mNeutralButtonListener = listener;

mNeutralButtonText = text;

return this;

}

@Override

public CustomAlertDialogBuilder setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener) {

mPositiveButtonListener = listener;

mPositiveButtonText = text;

return this;

}

@Override

public CustomAlertDialogBuilder setNegativeButton(int textId, DialogInterface.OnClickListener listener) {

setNegativeButton(getContext().getString(textId), listener);

return this;

}

@Override

public CustomAlertDialogBuilder setNeutralButton(int textId, DialogInterface.OnClickListener listener) {

setNeutralButton(getContext().getString(textId), listener);

return this;

}

@Override

public CustomAlertDialogBuilder setPositiveButton(int textId, DialogInterface.OnClickListener listener) {

setPositiveButton(getContext().getString(textId), listener);

return this;

}

public CustomAlertDialogBuilder setCanceledOnTouchOutside (boolean cancelOnTouchOutside) {

mCancelOnTouchOutside = cancelOnTouchOutside;

return this;

}

@Override

public AlertDialog create() {

throw new UnsupportedOperationException("CustomAlertDialogBuilder.create(): use show() instead..");

}

@Override

public AlertDialog show() {

final AlertDialog alertDialog = super.create();

DialogInterface.OnClickListener emptyOnClickListener = new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) { }

};

// Enable buttons (needed for Android 1.6) - otherwise later getButton() returns null

if (mPositiveButtonText != null) {

alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, mPositiveButtonText, emptyOnClickListener);

}

if (mNegativeButtonText != null) {

alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, mNegativeButtonText, emptyOnClickListener);

}

if (mNeutralButtonText != null) {

alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, mNeutralButtonText, emptyOnClickListener);

}

// Set OnDismissListener if available

if (mOnDismissListener != null) {

alertDialog.setOnDismissListener(mOnDismissListener);

}

if (mCancelOnTouchOutside != null) {

alertDialog.setCanceledOnTouchOutside(mCancelOnTouchOutside);

}

alertDialog.show();

// Set the OnClickListener directly on the Button object, avoiding the auto-dismiss feature

// IMPORTANT: this must be after alert.show(), otherwise the button doesn't exist..

// If the listeners are null don't do anything so that they will still dismiss the dialog when clicked

if (mPositiveButtonListener != null) {

alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

mPositiveButtonListener.onClick(alertDialog, AlertDialog.BUTTON_POSITIVE);

}

});

}

if (mNegativeButtonListener != null) {

alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

mNegativeButtonListener.onClick(alertDialog, AlertDialog.BUTTON_NEGATIVE);

}

});

}

if (mNeutralButtonListener != null) {

alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

mNeutralButtonListener.onClick(alertDialog, AlertDialog.BUTTON_NEUTRAL);

}

});

}

return alertDialog;

}   }

编辑下面是一个关于如何使用CustomAlertDialogBuilder的小例子:// Create the CustomAlertDialogBuilderCustomAlertDialogBuilder dialogBuilder = new CustomAlertDialogBuilder(context);

// Set the usual data, as you would do with AlertDialog.BuilderdialogBuilder.setIcon(R.drawable.icon);dialogBuilder.setTitle("Dialog title");

dialogBuilder.setMessage("Some text..");// Set your buttons OnClickListenersdialogBuilder.setPositiveButton

("Button 1", new DialogInterface.OnClickListener() {

public void onClick (DialogInterface dialog, int which) {

// Do something...

// Dialog will not dismiss when the button is clicked

// call dialog.dismiss() to actually dismiss it.

}});// By passing null as the OnClickListener the dialog will dismiss when the button is clicked.

dialogBuilder.setNegativeButton ("Close", null);// Set the OnDismissListener (if you need it)

dialogBuilder.setOnDismissListener(new DialogInterface.OnDismissListener() {

public void onDismiss(DialogInterface dialog) {

// dialog was just dismissed..

}});// (optional) set whether to dismiss dialog when touching outsidedialogBuilder.setCanceledOnTouchOutside(false);

// Show the dialogdialogBuilder.show();

干杯,

尤维

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值