如何通过在Android中快速单击两次按钮来防止双码运行

Ada*_*gyi 12 android android-button

如果我快速点击我的Android应用程序中的按钮,它背后的代码似乎运行两次.如果我单击我的菜单按钮两次,必须启动的活动onclick只启动两次,我必须从它退出两次.

这真的很烦人,因为如果我点击太快的菜单按钮我可以在后台加载一大堆活动,我必须逐个退出它们,所以这显然是我的应用程序的错误状态我想解决这个问题.

我该怎么办这个问题?

我使用简单的onClickListeners和Buttons

编辑:

关于答案和评论,我的菜单按钮如下所示:

top20Button.setOnClickListener(new OnClickListener()
{
    public void onClick(View v)
    {
        favButton.setClickable(false);
        nearButton.setClickable(false);
        highlightedButton.setClickable(false);
        top20Button.setClickable(false);

        Intent i = new Intent();
        i.putExtra("showDialog", false);
        i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        i.setClass(Search.this, Top20.class);
        startActivity(i);
        finish();

    }
});
Run Code Online (Sandbox Code Playgroud)

在所有这些修正之后它仍然是相同的:S当我像疯子一样点击时,多个活动在历史堆栈上,我必须多次退出.

有什么建议 ?什么mi做错了?

Shr*_*ant 8

您可以使用以下代码:btn.setEnabled(false);

btn.setOnclickListener(new View.onClickListener(){

      public void onClick(View v) {
            btn.setEnabled(false);

      }
});
Run Code Online (Sandbox Code Playgroud)


Sim*_*ges 5

您可以像这样暂时禁用视图

public static void disableTemporarly(final View view) {

        view.setEnabled(false);
        view.post(new Runnable() {
            @Override
            public void run() {

                view.setEnabled(true);
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

编辑:

上述解决方案将正常工作。但是使用 Kotlin 的强大功能会变得更好

1) 创建 SafeClikc 监听器

class SafeClickListener(
        private var defaultInterval: Int = 1000,
        private val onSafeCLick: (View) -> Unit
) : View.OnClickListener {

    private var lastTimeClicked: Long = 0

    override fun onClick(v: View) {
        if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) {
            return
        }
        lastTimeClicked = SystemClock.elapsedRealtime()
        onSafeCLick(v)
    }
}
Run Code Online (Sandbox Code Playgroud)

2) 添加扩展函数以使其适用于任何视图,这将创建一个新的 SafeClickListener 并将工作委托给它

fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {

    val safeClickListener = SafeClickListener {
        onSafeClick(it)
    }
    setOnClickListener(safeClickListener)
}
Run Code Online (Sandbox Code Playgroud)

3)现在使用起来非常方便

settingsButton.setSafeOnClickListener {
    showSettingsScreen()
}
Run Code Online (Sandbox Code Playgroud)

快乐科特林 ;)


ana*_*ish 5

 Button.setOnClickListener(new View.OnClickListener {  
   @Override
   public void onClick(final View v) {
        v.setEnabled(false);
        v.postDelayed(new Runnable() {
         @Override
         public void run() {
            v.setEnabled(true);
         }
        },150); //150 is in milliseconds
    }
 });  
Run Code Online (Sandbox Code Playgroud)