Comment éviter plusieurs bouton cliquez en même temps dans android?

J'utilise deux boutons en vue. Tout en cliquant sur deux boutons simultanément, il va à une activité différente à la fois. Comment faire pour éviter cela?

J'ai essayé comme ça, mais cela ne fonctionne pas, veuillez enregistrer....

public class MenuPricipalScreen extends Activity {


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


    findViewById(R.id.imageView2).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            disable(findViewById(R.id.imageView3));

            Intent intent = new Intent(MenuPricipalScreen.this,
                    SelectYourLanguageVideo.class);
            startActivity(intent);
        }
    });
    findViewById(R.id.imageView3).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            disable(findViewById(R.id.imageView2));

            Intent intent = new Intent(MenuPricipalScreen.this,
                    CategoryScreen.class);
            intent.putExtra("request", "false");
            startActivity(intent);
        }
    });

}

 @Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    ((ImageView) findViewById(R.id.imageView3)).setEnabled(true);
    ((ImageView) findViewById(R.id.imageView2)).setEnabled(true);
    ((ImageView) findViewById(R.id.imageView3)).setClickable(true);
    ((ImageView) findViewById(R.id.imageView2)).setClickable(true);
    ((ImageView) findViewById(R.id.imageView3)).setFocusable(true);
    ((ImageView) findViewById(R.id.imageView2)).setFocusable(true);
}

 private void disable(View v) {
    Log.d("TAG", "TAG" + v.getId());
    v.setEnabled(false);
    v.setClickable(false);
    v.setFocusable(false);
}
}

Merci,

33
demandé sur Murali Ganesan 2014-01-07 16:20:36

6 réponses

La manière standard d'éviter plusieurs clics est d'enregistrer le dernier temps cliqué et d'éviter les autres clics de bouton dans 1 seconde (ou n'importe quel laps de temps). Exemple:

// 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.
        }
        ...
    }

    .
    .
    .

 }
94
répondu Shivanand Darur 2017-02-19 17:04:14

, Vous pouvez désactiver le multi-touch sur votre application en utilisant ce android:splitMotionEvents="false" et android:windowEnableSplitTouch="false" dans votre thème.

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    ...
    <item name="android:splitMotionEvents">false</item>
    <item name="android:windowEnableSplitTouch">false</item>
</style>
31
répondu demir 2016-11-22 04:06:47

Solution Bon Marché:

Vous n'avez pas une séparation correcte des préoccupations (MVP ou n'importe quelle saveur) donc vous mettez votre code dans votre activité/Fragment

  • Si vous ne pouvez pas gérer cela correctement, n'utilisez au moins pas de solutions non déterministes (comme une minuterie).

  • Utiliser les outils que vous avez déjà, disons que vous avez ce 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(…);
    }
}

Maintenant... dans un endroit complètement différent dans votre logique, comme... par exemple, votre onCreate ou votre onResume ou n'importe où, où vous savez que vous voulez que votre bouton fonctionne à nouveau...

 myButton.setEnabled(true);

Approche"Plus Moderne":

  1. faites de même, mais mettez la logique dans votre présentateur.
  2. votre présentateur décidera si l'action "bouton" a été déclenchée.
  3. votre présentateur indiquera sa "vue": enableMyButton(); ou disableMyButton() selon.
  4. votre vue fera la bonne chose.
  5. Vous savez... séparation fondamentale des préoccupations.

POURQUOI "activé (vrai / faux)"?

Parce qu'il est intégré. Parce que le bouton respectera son état (et si vous avez une liste d'état correcte, il changera d'apparence pour vous, et parce que ce sera toujours ce que vous attendez). Aussi, parce qu'il est plus facile de tester un présentateur plein de mocks, qu'une activité complète qui peut croître pour toujours dans le code.

2
répondu Martin Marconcini 2018-03-05 22:00:34

Vous pouvez essayer ma petite bibliothèque, elle fournit exactement ce que vous voulez en utilisant la même approche que la solution de Shivanand. https://github.com/RexLKW/SClick

0
répondu Rex Lam 2016-10-15 00:16:17

Une pratique "meilleure" consiste à utiliser onClickListener comme ceci ->

OnClickListener switchableListener = new OnClickListener(@Override
    public void onClick(View arg0) {
        arg0.setOnClickListener(null);

        (or) use the view directly as a final variable in case of errors
             ex :
                     textView.setOnClickListener(null);


         // Some processing done here

         Completed , enable the onclicklistener arg0.setOnClickListener(switchableListener);
    });

Cela devrait résoudre le problème et c'est une façon assez simple de gérer les choses

0
répondu TheAnimatrix 2017-01-29 20:39:28

Ma suggestion est dans chaque clic de bouton avant d'exécuter tout autre code utiliser la méthode hasFocus (). Une seule vue peut avoir le focus à un moment donné, donc cela devrait vous empêcher de cliquer sur les deux

-2
répondu KBusc 2014-01-07 12:29:35