web-dev-qa-db-fra.com

Comment éviter de cliquer plusieurs fois en même temps dans Android?

J'utilise deux boutons en vue. Lorsque vous cliquez simultanément sur deux boutons, vous passez d’une activité à la fois. Comment éviter cela?

J'ai essayé comme ça, mais ça ne marche pas s'il te plaît sauve ....

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,

37
Murali Ganesan

Pour éviter les clics multiples, la méthode standard consiste à enregistrer la dernière heure cliquée et à éviter les clics des autres boutons en moins d'une seconde (ou à tout autre intervalle de temps).

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

    .
    .
    .

 }
98
Shivanand Darur

vous pouvez désactiver le multi-touch sur votre application en utilisant ces 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>
34
demir

Solution pas cher:

Vous n’avez pas une séparation correcte des préoccupations (MVP ou toute autre saveur), vous insérez donc votre code dans votre activité/fragment.

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

  • Utilisez 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 de base 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’états correcte, il changera l’apparence pour vous et parce que ce sera toujours ce que vous attendez). En outre, il est plus facile de tester un présentateur plein de faux-semblants qu’une activité complète qui peut évoluer à jamais dans le code. 

3

Une "meilleure" pratique 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 un moyen assez simple de gérer les choses 

0
TheAnimatrix

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

0
Rex Lam