在安卓系统中防止双击按钮的最佳方法是什么?


当前回答

试试这个Kotlin扩展函数:

private var lastClickTime = 0L

fun View.click(action: () -> Unit) {
    setOnClickListener {
        if (SystemClock.elapsedRealtime() - lastClickTime < 600L)
            return@setOnClickListener
        lastClickTime = SystemClock.elapsedRealtime()
        action()
    }
}

它还防止在同一时间点击应用程序的各个部分。

其他回答

在kotlin

button.setOnClickListener { 
    it?.apply { isEnabled = false; postDelayed({ isEnabled = true }, 400) } //400 ms
    //do your work
}

您也可以使用jake Wharton的rx绑定来实现这一点。下面是一个连续点击之间间隔2秒的例子:

RxView.clicks(btnSave)
                .throttleFirst(2000, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept( Object v) throws Exception {
//handle onclick event here
                });

//注意:忽略对象v在这种情况下,我认为总是。

当UI线程阻塞时,单击事件队列。对于按钮单击事件,请尽快将其更改为后台任务,以避免单击事件在彼此后面排队。

在activity类中声明一个volatile boolean或lock:

private volatile boolean saving = false;

创建一个onClickListener按钮,通过保存和启动一个后台任务来完成工作:

saveButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
        if (!saving) {
            saving = true;
            new SaveAsyncTask().execute();
        }
    }
});

创建一个内部的SaveAsyncTask类来在后台完成工作:

class SaveAsyncTask extends AsyncTask {

    @Override
    protected Object doInBackground(Object[] objects) {
        // Do something here, simulate a 3 second task
        SystemClock.sleep(3000);
        saving = false;
        return null;
    }
}

这个解决方案既快速又简洁。

基本上你只是在应用程序的基本样式中防止双击,并在点击监听器上实现标准。这就像一种魔力,在不同的观点的同时进行触摸。

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
...
<item name="android:splitMotionEvents">false</item>
<item name="android:windowEnableSplitTouch">false</item>
</style>

如果你的应用程序使用某种手势事件,这不是正确的答案。

setEnabled(false)非常适合我。

我写{setEnabled(true);},并在第一次点击按钮时将其设为false。