我有一个自定义首选项TimePreference,它扩展了DialogPreference
。它有一个自定义对话框资源,看起来像这样
来源是
@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。
答案 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);
}