这是我在onClick()中的操作。问题是,如果我按两次按钮,新活动将被打开两次。我尝试使用setEnabled()和setClickable(),但是它不起作用。它仍然显示了不止一项活动
def exists_timeout(path, timeout):
"""Return once <path> exists, or after <timeout> seconds,
whichever is sooner
"""
timer = timeout
while (not os.path.exists(path)) and timer > 0:
time.sleep(1)
timer -= 1
答案 0 :(得分:3)
尝试从作为他第一次被点击后可点击禁用按钮:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//add this line
button.setClickable(false);
Intent intent = new Intent(getActivity(),
CalendarActivity.class);
intent.putExtra("day", 16);
intent.putExtra("month", 12);
intent.putExtra("year", 1996);
startActivityForResult(intent, CALENDAR_ACTIVITY_CODE);
}
});
如果这不会帮助你,你可以去你的活动清单和补充一点:
android:launchMode = "singleTop"
答案 1 :(得分:2)
这实际上是一个令人惊讶的复杂问题。问题的根源在于UI事件(例如,单击按钮)导致 messages 被“发布”到消息队列的末尾。如果速度足够快,则可以在处理第一个消息之前将其中许多消息发布到消息队列中。
这意味着,即使禁用onClick()
方法中的按钮也无法真正解决问题(因为在处理第一条消息之前,禁用不会“发生”,但是您可能已经有其他三个重复项了)在邮件队列中等待的邮件。
最好的办法是在onClick()
内跟踪某种布尔标志并每次检查标志:
private boolean firstClick = true;
button.setOnClickListener(v -> {
if (firstClick) {
firstClick = false;
// do your stuff
}
});
当然,每当您要重新启用按钮点击时,都必须记住将firstClick
重置为true。
答案 2 :(得分:0)
要解决此问题,您可以使用Jake Wharton Rxbinding库,它允许你转换你的点击事件到流。
您可以添加一个节流事件,该事件有助于从指定时间停止该事件
RxView.clicks(button).throttleFirst(2, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread()).
subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) {
Toast.makeText(getApplicationContext(), "Avoid multiple clicks using throttleFirst", Toast.LENGTH_SHORT).show();
}
});