一个按钮触发一个只应该被调用一次的动作。在执行操作之前,该按钮被禁用并隐藏在 onClick 处理程序中:
someButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
someButton.setEnabled(false);
someButton.setClickable(false);
someButton.setVisibility(View.GONE);
performTaskOnce();
}
});
private void performTaskOnce() {
Log.i("myapp", "Performing task");
//Do something nontrivial that takes a few ms (like changing the view hierarchy)
}
即使按钮立即被禁用,仍然可以通过快速点击多次来触发多个“onClick”事件。(即被performTaskOnce
多次调用)。似乎 onClick 事件在按钮实际被禁用之前排队。
我可以通过检查每个单独的 onClick 句柄是否已禁用相应的按钮来解决问题,但这似乎是一个 hack。有没有更好的方法来避免这个问题?
该问题出现在 Android 2.3.6 上,我无法在 Android 4.0.3 上重现它。但鉴于 4.x 设备的稀有性,排除旧设备不是一个选项。