AlertDialog中EditText验证问题:仅输入非空时才允许关闭弹窗
解决AlertDialog确定按钮仅在EditText非空时关闭的问题
你的问题出在AlertDialog默认的PositiveButton行为上——系统会在点击该按钮时自动关闭对话框,不管你在onClick回调里做了什么判断。所以即使你在输入为空时显示了Toast,对话框还是会被系统默认关闭,这就是你遇到的核心问题。
要解决这个问题,我们需要接管PositiveButton的点击事件,阻止系统的默认关闭逻辑,只在输入有效时手动关闭对话框。下面是修改后的完整代码:
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); builder.setTitle("Author Desc."); final EditText descInput = new EditText(mActivity); descInput.setInputType(InputType.TYPE_CLASS_TEXT); descInput.setTextColor(ContextCompat.getColor(mActivity, R.color.black)); descInput.setLines(5); descInput.setGravity(Gravity.LEFT | Gravity.TOP); descInput.setSingleLine(false); descInput.setHorizontalScrollBarEnabled(false); builder.setView(descInput); // 先设置PositiveButton,暂时传入空回调避免触发系统默认关闭逻辑 builder.setPositiveButton("SAVE", null); builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alertDialog = builder.create(); alertDialog.setCancelable(false); alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); alertDialog.show(); // 对话框显示后,获取PositiveButton并设置自定义点击事件 Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); positiveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { strAuthorDesc = descInput.getText().toString().trim(); // 用TextUtils.isEmpty简化非空判断,比手动判断null和空字符串更严谨 if (!TextUtils.isEmpty(strAuthorDesc)) { alertDialog.dismiss(); // 输入有效时手动关闭对话框 Const.showToast("Description added", mActivity); setAuthorDesc(); } else { Const.showToast("Desc. cannot be empty!", mActivity); // 输入为空,不执行关闭操作,对话框保持显示 } } });
关键修改说明:
- 初始化PositiveButton时传入
null作为点击回调,绕过系统默认的自动关闭逻辑 - 在
alertDialog.show()之后获取按钮实例,替换为我们自定义的点击监听 - 使用
TextUtils.isEmpty()简化非空判断,覆盖了字符串为null、空串、全空格的情况 - 仅当输入内容有效时,才调用
alertDialog.dismiss()手动关闭对话框
这样修改后,点击SAVE按钮时,如果EditText为空,对话框会保留并提示用户,只有输入有效内容后才会关闭弹窗。
内容的提问来源于stack exchange,提问作者Chandan Pednekar
相关产品推荐
相关产品推荐

