关闭自定义首选项的对话框

时间:2014-01-14 19:54:51

标签: android android-preferences android-dialog

我有一个自定义首选项TimePreference,它扩展了DialogPreference。它有一个自定义对话框资源,看起来像这样

Three buttons with their IDs

来源是

@Override
protected void onBindDialogView(View v){
    super.onBindDialogView(v);

    v.findViewById(R.id.butCancel).setOnClickListener(onClickL);
    v.findViewById(R.id.butNow).setOnClickListener(onClickL);
    v.findViewById(R.id.butOK).setOnClickListener(onClickL);
    //....
}
//...
private final View.OnClickListener onClickL = new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        Log.d(lTag, v + " clicked");
        switch (v.getId()) {
            case R.id.butOK: saveToSP(false);break;
            case R.id.butNow: saveToSP(true);
        }

        try {
            getDialog().dismiss(); //may throw null pointer
        } catch (Exception e) { Log.w(lTag, "Exc @onClickL", e); }
    }
};
//...

我发现了一个错误,如果你真的快速点击相同的偏好两次(在首选屏幕上),就会打开两个对话框。您可以关闭第一个但是,当您尝试关闭第二个时,应用程序将崩溃。这是一个NullPointerException,所以我将它包含在try-catch块中。现在,异常被捕获,但按钮不会关闭对话框。请注意,通过单击 back 关闭。

如何关闭第二个对话框(可能通过模拟后退按钮的行为?)?注意,我希望API级别低于10。

1 个答案:

答案 0 :(得分:0)

好的,我找到了灵魂。我有一个静态布尔值,显示是否有一个打开的对话框。

private static boolean isAnyDialogOpen = false;

在对话框绑定中,我将其设置为true, 关闭对话框后,我将其设置为false。 事实证明,即使这是有问题的,但解决方案更容易

@Override
protected void onClick() {
    if (isAnyDialogOpen)
        Log.i(lTag, "there is a dialog already");
    else {
        isAnyDialogOpen = true;
        super.onClick();
    }
}
@Override
public void onDismiss(DialogInterface dialog) {
    Log.d(lTag, "dismiss, dialog= "+dialog);

    isAnyDialogOpen = false;
    if (dialog != null) super.onDismiss(dialog);
}