Android 点击 AlertDialog 的确定按钮对话框不关闭的方法

本文探讨了Android中如何防止AlertDialog在点击确定按钮时立即关闭。通过源码分析,了解到默认情况下,Dialog在按钮点击后会关闭。为解决此问题,可以利用AlertDialog的getButton方法获取确定按钮,并自定义OnClickListener,从而在点击后根据业务逻辑决定是否关闭对话框。设置时机应在Dialog显示时,即使用setOnShowListener方法。
摘要由CSDN通过智能技术生成

一、问题描述

最近在做项目需要在弹出 含 EditText 让用户输入的对话框,在按确定按钮时需要对输入的内容进行校验,但出现的问题是一按确定按钮就对话框就关闭,现在的问题是要让对话框在按确定按钮时对 EditText 的内容进行校验,如果校验不通过就不关闭,校验通过才关闭。

private AppCompatButton mBtnShowDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mBtnShowDialog = (AppCompatButton)findViewById(R.id.btn_show_dialog);
    View viewDialog = getLayoutInflater().inflate(R.layout.view_dialog, null);
    final AppCompatEditText etInput = (AppCompatEditText)viewDialog.findViewById(R.id.et_input);
    final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
            .setTitle("我是标题啊")
            .setView(viewDialog)
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    String text = etInput.getText().toString().trim();
                    if (!TextUtils.isEmpty(text)) {
                        Toast.makeText(MainActivity.this,
                                "" + text, Toast.LENGTH_SHORT).show();
                    } else {
                            Toast.makeText(MainActivity.this, "输入为空", Toast.LENGTH_SHORT).show();
                    }
                }
            })
            .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                }
            }).create();
    mBtnShowDialog.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            dialog.show();
        }
    });
}

按照上面的这样做是没办法阻止 Dialog 关闭的

运行结果截图

二、源码分析

于是就去看了下源码,
先点进 AlertDialog.Builder 的 setPositiveButton 方法去看看,

代码截图

可以看到传进去的参数是赋给一个叫 P 的引用的

/**
         * Set a listener to be invoked when the positive button of the dialog is pressed.
         * @param textId The resource id of the text to display in the positive button
         * @param listener The {@link DialogInterface.OnClickListener} to use.
         *
         * @return This Builder object to allow for chaining of calls to set methods
         */
        public Builder setPositiveButton(@StringRes int textId, final OnClickListener listener) {
            P.mPositiveButtonText = P.mContext.getText(textId);
            P.mPositiveButtonListener = listener;
            return this;
        }

这个 P 的引用呢,是 AlertController.AlertParams 类型的

    public static class B
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值