How to avoid multiple button click at same time in android?

you can disable the multi-touch on your app by using this android:splitMotionEvents="false" and android:windowEnableSplitTouch="false" in your theme.

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

The standard way to avoid multiple clicks is to save the last clicked time and avoid the other button clicks within 1 second (or any time span). Example:

// Make your activity class to implement View.OnClickListener
public class MenuPricipalScreen extends Activity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // setup listeners.
        findViewById(R.id.imageView2).setOnClickListener(MenuPricipalScreen.this);
        findViewById(R.id.imageView3).setOnClickListener(MenuPricipalScreen.this);
        ...
     }

    .
    .
    .

    // variable to track event time
    private long mLastClickTime = 0;

    // View.OnClickListener.onClick method defination

    @Override
    public void onClick(View v) {
        // Preventing multiple clicks, using threshold of 1 second
        if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) {
            return;
        }
        mLastClickTime = SystemClock.elapsedRealtime();

        // Handle button clicks
        if (v == R.id.imageView2) {
            // Do your stuff.
        } else if (v == R.id.imageView3) {
            // Do your stuff.
        }
        ...
    }

    .
    .
    .

 }

Cheap Solution:

You don’t have a correct separation of concerns (MVP or any flavor) so you put your code in your Activity/Fragment

  • If you can’t handle this the correct way, at least do not use non-deterministic solutions (like a timer).

  • Use the tools you already have, say you have this code:


//Somewhere in your onCreate()
Button myButton = findViewById… 
myButton.setOnClickListener(this);

// Down below…
@Override
public void onClick(View view) {
     if (myButton.isEnabled()) {
        myButton.setEnabled(false);
        // Now do something like…
        startActivity(…);
    }
}

Now… in a completely different place in your logic, like… for example, your onCreate or your onResume or anywhere where you know you want your button working again…

 myButton.setEnabled(true);

“More Modern” Approach:

  1. Do the same, but put the logic in your Presenter.
  2. Your presenter will decide if the “button” action has been triggered.
  3. Your presenter will tell its “view”: enableMyButton(); or disableMyButton() depending.
  4. Your View will do the right thing.
  5. you know… basic separation of concerns.

WHY “enabled(true/false)”?

Because it’s built in. Because the button will respect its state (and if you have a correct state list, it will change appearance for you, and because it will always be what you expect). Also, because it’s easier to test a presenter full of mocks, than a full activity that can grow forever in code.