我有一个带有OnClickListener的Button.为了便于说明,请考虑一个显示模态对话框的按钮:
public class SomeActivity ... {
protected void onCreate(Bundle state) {
super.onCreate(state);
findViewById(R.id.ok_button).setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
// This should block input
new AlertDialog.Builder(SomeActivity.this)
.setCancelable(true)
.show();
}
});
}
Run Code Online (Sandbox Code Playgroud)
在正常使用情况下,会出现警告对话框并阻止进一步输入.用户必须先关闭对话框才能再次点击该按钮.
但有时在对话框出现之前,按钮的OnClickListener会被调用两次.您可以通过快速点击按钮轻松复制此内容.我通常必须在它发生之前尝试几次,但迟早我会在对话框阻止输入之前触发多次onClick(...)调用.
我在Motorola Droid手机的Android 2.1中看到了这种行为.我们在市场上收到了4份崩溃报告,表明这种情况偶尔发生在人们面前.
这取决于我们的OnClickListeners所做的事情,这会导致各种各样的破坏.我们怎样才能保证阻塞对话框在第一次点击后实际阻止输入?
Bob*_*Lee 17
Romain Guy确认这确实是Android中的一个错误:"仅当用户设法在<125ms内按下按钮两次时才会发生这种情况.我相信我们已经修复了Froyo中可能存在的错误."
我们将使用"玻璃窗格"模式来解决旧操作系统上的错误.也就是说,我们将以隐形视图覆盖屏幕.在第一次点击事件之后,我们将使视图"可见",以便拦截后续触摸事件.
仅仅按一个按钮就不足以阻止其他事件.您需要阻止整个活动的所有后续事件,直到对话框被解除,活动恢复等,此时您再次使玻璃窗格"不可见".
如果这不起作用,我们将不得不忍受这一点,并更好地容忍意外的额外事件.
感谢您的尝试,mdma,但这是一个平台问题,而不是我们的代码问题.更糟糕的是,它显然不是一个可以在用户代码中解决的问题(它需要触摸屏驱动程序中未传递的细节).此外,您的代码示例并不像您认为的那样.show()不会立即显示对话框.它会在事件队列的末尾添加一条消息,最终显示该对话框.在onClick()返回后,更多触摸事件可能已在队列中等待执行.
我不确定为什么人们会投票回答.
| 归档时间: |
|
| 查看次数: |
2852 次 |
| 最近记录: |