我的应用程序有问题,如果用户快速多次单击该按钮,那么即使我按下该按钮的对话框消失,也会生成多个事件
通过在单击按钮时将布尔变量设置为标志,我知道了一种解决方案,因此可以阻止将来的点击,直到关闭对话框.但是我有很多按钮,每次按钮都必须这样做,因为每个按钮似乎都是一种矫枉过正.在Android(或许是一些更智能的解决方案)中,没有其他方法只允许每个按钮点击生成事件动作吗?
更糟糕的是,即使处理第一个操作,多个快速点击似乎也会生成多个事件操作,因此如果我想在第一个单击处理方法中禁用该按钮,则队列中已存在等待处理的事件操作!
请帮忙谢谢
如何在Android中实现双击按钮?我应该使用OnDoubleTapListener吗?
我有一个带有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所做的事情,这会导致各种各样的破坏.我们怎样才能保证阻塞对话框在第一次点击后实际阻止输入?
有很多与后台堆栈管理相关的问题,但没有一个真正让我满意。我发现的越接近那个,但对我来说它看起来像是一种丑陋的解决方法。
当在活动按钮点击一个,我发起一项活动乙用startActivityForResult(),期待一个简单的一个- >乙回堆栈。但是如果你足够快地向按钮发送垃圾邮件,你最终会触发两个意图,因此两个活动堆叠A -> B -> B。
我试图使用FLAG_ACTIVITY_SINGLE_TOP标志来防止第二个创建B活动,但它没有改变任何东西:
这是活动A 中的按钮侦听器:
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), ActivityB.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivityForResult(intent, REQUEST_CODE);
}
});
Run Code Online (Sandbox Code Playgroud)
并且日志明确指出onCreate()in 调用了两次(而不是预期的onNewIntent):
btn.onClick()
活动B.onCreate()
btn.onClick()
活动B.onCreate()
我的活动必须不为singleTask也singleInstance,他们应该只是返回堆叠任何经常性活动的一部分。任何许可将不胜感激!