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,
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.
}
...
}
.
.
.
}
, 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>
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":
- faites de même, mais mettez la logique dans votre présentateur.
- votre présentateur décidera si l'action "bouton" a été déclenchée.
- votre présentateur indiquera sa "vue":
enableMyButton();
oudisableMyButton()
selon. - votre vue fera la bonne chose.
- 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.
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
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
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