Android AlertDialog与DialogFragment:don';即使单击“确定”,也不要关闭对话框

Android AlertDialog与DialogFragment:don';即使单击“确定”,也不要关闭对话框,android,android-alertdialog,android-dialogfragment,Android,Android Alertdialog,Android Dialogfragment,我有一个带有自定义布局的AlertDialog(只是一个EditText),我想在单击OK按钮时验证数据。如果验证失败,我不想关闭对话框 我使用的是对话框的默认按钮(正片和负片)。如果我使用“setPositiveButton”(“,new DialogInterface.OnClickListener()…”,对话框总是关闭的。我看过几篇文章,他们说onClick Listener应该被覆盖,但我无法让它工作。这是我找到的代码: Button theButton = dialog.getBut

我有一个带有自定义布局的AlertDialog(只是一个EditText),我想在单击OK按钮时验证数据。如果验证失败,我不想关闭对话框

我使用的是对话框的默认按钮(正片和负片)。如果我使用“setPositiveButton”(“,new DialogInterface.OnClickListener()…”,对话框总是关闭的。我看过几篇文章,他们说onClick Listener应该被覆盖,但我无法让它工作。这是我找到的代码:

Button theButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
theButton.setOnClickListener(new CustomListener(dialog));
因为它说应该在显示对话框后执行,所以我将此代码放在我的活动中,而不是放在DialogFragment中,但是如果我使用mDialogFragment.getDialog(),它总是返回null

这是我的对话片段的一部分:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    builder.setTitle(R.string.new);

    LayoutInflater inflater = getActivity().getLayoutInflater();
    dialogView = inflater.inflate(R.layout.edit_license, null);

    builder.setView(dialogView)

    // Add action buttons
    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int id) {

        }
    })
    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            MyDialogFragment.this.getDialog().cancel();
        }
    }); 

    return builder.create();

}
在我的活动中,我做了以下几点:

DialogFragment dialog = new MyDialogFragment(true, null);
dialog.show(getSupportFragmentManager(), "EditLicenseDialogFragment");

AlertDialog alertDialog = (AlertDialog)dialog.getDialog();
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
btnPositive.setOnClickListener(new CustomListener(alertDialog));

... 

class CustomListener implements View.OnClickListener {
    private final Dialog dialog;
    public CustomListener(Dialog dialog) {
        this.dialog = dialog;
    }
    @Override
    public void onClick(View v) {
        ...
    }
}
就像我说的,(AlertDialog)dialog.getDialog();总是返回null。为什么?如果验证不正常,我如何避免关闭对话框


谢谢!

以下是参考文献中的一些文字:

显示对话框窗口的片段,浮动在其顶部 活动的窗口。此片段包含一个对话框对象,它 根据片段的状态适当显示。控件 对话框(决定何时显示、隐藏或取消)应该完成 通过此处的API,而不是直接调用对话框。


您不应该调用getDialog().Disclease(),而应该执行Disclease()

此解决方案适合我。onResume中已经可以看到对话框,因此这是访问按钮和替换侦听器的好地方

public class XYZFragment extends DialogFragment {
   ...

    @Override
    public void onResume() {
        super.onResume();

        AlertDialog dialog = (AlertDialog)getDialog();

        Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
        positiveButton.setOnClickListener(new View.OnClickListener() {                  
            @Override
            public void onClick(View onClick) {
            ...
            }
        });
    }
}

有趣。那么getButton函数呢?它不在DialogFragment上,如果我尝试获取该对话框,它将返回null。该对话框将返回null,因为getDialog返回的mDialog尚未创建。解决方案是在DialogFragment中实现其他生命周期方法,这些方法发生在onCreateDialog/show函数之后。但这对您来说并不是一个真正的问题,只需在DialogFragment中定义clickListener(现在是这样)。但不要在dialog上执行对话操作,而是在dialogfragment上执行对话操作,这样您就不需要调用getDialog(),我现在看不到“确定”按钮