Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止Android应用程序中的双击?_Android_Onclicklistener_Android Button - Fatal编程技术网

如何防止Android应用程序中的双击?

如何防止Android应用程序中的双击?,android,onclicklistener,android-button,Android,Onclicklistener,Android Button,我的应用程序有大约50-60个屏幕。每个屏幕都有一个按钮,用于打开新屏幕。现在我面临的问题是,当用户双击按钮时,新屏幕会打开两次 对于这个问题,我找到了如下解决方案 if (SystemClock.elapsedRealtime() - mLastClickTime < 1000){ return; } mLastClickTime = SystemClock.elapsedRealtime(); if(

我的应用程序有大约50-60个屏幕。每个屏幕都有一个按钮,用于打开新屏幕。现在我面临的问题是,当用户双击按钮时,新屏幕会打开两次

对于这个问题,我找到了如下解决方案

 if (SystemClock.elapsedRealtime() - mLastClickTime < 1000){
                return;
            }

            mLastClickTime = SystemClock.elapsedRealtime();
if(SystemClock.elapsedRealtime()-mLastClickTime<1000){
返回;
}
mLastClickTime=SystemClock.elapsedRealtime();
但是为了防止双击,我需要在每次单击按钮时编写上面的代码。我还没有创建通用的自定义按钮,到处都可以使用


有什么方法可以双击应用程序级别吗?

使用此自定义类,它可以处理按钮单击事件上的任何双选项卡或单选项卡

public class DoubleTabCustomButton implements View.OnClickListener {

    private boolean isRunning = true;
    private int resetInTime = 500;
    private int counter = 0;

    private DoubleClickCallback listener;

    public DoubleTabCustomButton(Context context) {
        listener = (DoubleClickCallback) context;
    }

    @Override
    public void onClick(View v) {

        if (isRunning) {
            if (counter == 1) {
                listener.onDoubleClick(v);
            }
            else if (counter==0){
                listener.onSingleClick(v);
            }

            counter++;

            if (!isRunning) {
                isRunning = true;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(resetInTime);
                            isRunning = false;
                            counter = 0;
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }

        }

    }
}
它的界面

public interface DoubleClickCallback {

    public void onDoubleClick(View v);

    public void onSingleClick(View V);
}
最后,您可以在这样的活动中使用

public class ButtonDoubleTab extends AppCompatActivity implements DoubleClickCallback {

    Button btndoubletab;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_button_double_tab);

        btndoubletab=findViewById(R.id.btndoubletab);
       // btndoubletab.setOnClickListener(this);
        btndoubletab.setOnClickListener(new DoubleTabCustomButton(this));
    }
    @Override
    public void onDoubleClick(View v) {
        //do double tab action
    }

    @Override
    public void onSingleClick(View V) {
       //single tab action 
    }
}

单击后禁用
按钮

b.setEnabled(false);
您可以使其返回启用它
onResume
或任何其他特定回调

  b.setEnabled(true);

我得到了同样的问题,我解决了它,如下它可能会对你有帮助

你可以通过两种方式实现 One: 尝试使用
boolean
变量:

public class Blocker {
    private static final int BLOCK_TIME = 1000;
    private boolean isBlockClick;

    /**
     * Block any event occurs in 1000 millisecond to prevent spam action
     * @return false if not in block state, otherwise return true.
     */
    public boolean block(int blockInMillis) {
        if (!isBlockClick) {
            isBlockClick= true;
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    isBlockClick= false;
                }
            }, blockInMillis);
            return false;
        }
        return true;
    }

    public boolean block() {
        return block(BLOCK_TIME );
    }
} 
在每次单击中使用此选项,如下所示

button.setOnClickListener(new View.OnClickListener() {
            private Blocker blocker = new Blocker();

            @Override
            public void onClick(View v) {
                if (!blocker.block(block-Time-In-Millis)) {
                    // do your action   
                }
            }
        });
两个 或者您可以在按钮的每个单击事件上设置
按钮。设置启用(false)
,如下所示

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                btn.setEnabled(false);
            }
        });

使用此内联函数:

 inline fun View.onSingleClick(minimumClickInterval: Long = 800, crossinline onClick: (View?) -> Unit) {
        var isViewClicked = false
        var mLastClickTime = 0L

        setOnClickListener { view ->

            val currentClickTime = SystemClock.uptimeMillis()
            val elapsedTime = currentClickTime - mLastClickTime

            mLastClickTime = currentClickTime

            if (elapsedTime <= minimumClickInterval)
                return@setOnClickListener

            if (!isViewClicked) {
                isViewClicked = true

                Handler(Looper.getMainLooper()).postDelayed({ isViewClicked = false }, 600)
            } else {
                return@setOnClickListener
            }

            onClick(view)

            Log.d(this.javaClass.simpleName, "onSingleClick successfully called")
        }
    }
您还可以按如下方式设置最小单击间隔:

button.onSingleClick {
    // do something here on the button click  
}
button.onSingleClick(1000) {
    // do something here on the button click  
}

实际上,您可以通过将标志Intent.flag_ACTIVITY_REORDER_to_FRONT添加到Intent来设置活动不具有多个实例


如果该活动在堆栈中,则不会创建两次

如果您有一个基本活动类,则可以重写startActivity(Intent)方法,将Intent.FLAG\u activity\u REORDER\u添加到\u FRONT



想一想,如果一个按钮刚被点击就突然被禁用,那将是一种多么糟糕的用户体验。我真的很惊讶,你还没有看到任何应用程序在点击按钮后,它会在一段时间内用消息或颜色禁用按钮。@Léagrisf举个例子,你见过任何应用程序要求OTP吗?你能点击多次吗?@LéaGris
abstract class BaseActivity: AppCompatActivity() {

    final override fun startActivity(intent: Intent) {
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
        super.startActivity(intent)
    }
}