如何防止双击按钮重复动作?

时间:2019-02-01 21:42:19

标签: android onclicklistener buttonclick

这是我在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

3 个答案:

答案 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();
                            }
                        });