一、问题描述
最近在做项目需要在弹出 含 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