How to prevent double code running by clicking twice fast to a button in Android

后端 未结 8 734
攒了一身酷
攒了一身酷 2021-01-17 12:42

If i click fast to my button in my Android app, it seems that code behind it runs twice. If i click my menu button twice the activity that has to be launch onclick just star

相关标签:
8条回答
  • 2021-01-17 12:59

    You can use following code: btn.setEnabled(false);

    btn.setOnclickListener(new View.onClickListener(){
    
          public void onClick(View v) {
                btn.setEnabled(false);
    
          }
    });
    
    0 讨论(0)
  • 2021-01-17 13:04

    Add the following code snipet to your Activity definition in Androidmanifest.xml

    android:launchMode = "singleTask"
    
    0 讨论(0)
  • 2021-01-17 13:06
     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
        }
     });  
    
    0 讨论(0)
  • 2021-01-17 13:06

    This solves the issue of multiple Instances of activity, and still play the default animation

    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
    0 讨论(0)
  • 2021-01-17 13:08

    You can Disable the view temporarily like this

    public static void disableTemporarly(final View view) {
    
            view.setEnabled(false);
            view.post(new Runnable() {
                @Override
                public void run() {
    
                    view.setEnabled(true);
                }
            });
        }
    

    Edit:

    The above solution will work fine. But it will become even better when using the power of Kotlin

    1) Create the SafeClikc Listener

    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)
        }
    }
    

    2) Add extension function to make it works with any view, this will create a new SafeClickListener and delegate the work to it

    fun View.setSafeOnClickListener(onSafeClick: (View) -> Unit) {
    
        val safeClickListener = SafeClickListener {
            onSafeClick(it)
        }
        setOnClickListener(safeClickListener)
    }
    

    3) Now it is very easy to use it

    settingsButton.setSafeOnClickListener {
        showSettingsScreen()
    }
    

    Happy Kotlin ;)

    0 讨论(0)
  • 2021-01-17 13:10

    This solution fits better to my requirements. Instead using enable/disable view feature. I use the time, first, create a variable to store the last time user pressed the view* then when the user presses the view, capture the time in a variable in order to compare the current moment and the last time user pressed the view, if the differential time between times is too small, which means fast,or extremely fast just ignore it and that's it. But if its a reasonable time to you, set the last time variable with the current time and do whatever else you want to do.

    @Override
    public void onListItemClick(ListView list, View item, int position, long id) {
    
        Long now = System.currentTimeMillis();
        if((now - lastTimeSelected) > 500){
            lastTimeSelected = now;
            // your code goes here
        } else {
            Log.i(TAG, "Too fast!");
        }
    
    }
    

    I saw a similar answer on other post, but nobody seems to like this approach.

    0 讨论(0)
提交回复
热议问题