reales - manual android studio avanzado
¿Cómo evitar el botón múltiple al mismo tiempo en Android? (6)
Estoy usando dos botones a la vista. Al hacer clic en dos botones simultáneamente, irá a diferentes actividades a la vez. ¿Cómo evitar esto?
Lo intenté así, pero no funciona, por favor, salva ...
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);
}
}
Gracias,
Solución barata:
No tiene una separación correcta de preocupaciones (MVP o cualquier sabor) por lo que pone su código en su Actividad / Fragmento
Si no puede manejar esto de la manera correcta, al menos no use soluciones no deterministas (como un temporizador).
Usa las herramientas que ya tienes, digamos que tienes este código:
//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(…);
}
}
Ahora ... en un lugar completamente diferente de su lógica, como ... por ejemplo, su onCreate o su onResume o en cualquier lugar donde sepa que desea que su botón vuelva a funcionar ...
myButton.setEnabled(true);
Enfoque "más moderno":
- Haga lo mismo, pero ponga la lógica en su Presentador.
- Su presentador decidirá si la acción del "botón" se ha activado.
- Su presentador dirá su "vista":
enableMyButton();
odisableMyButton()
dependiendo. - Tu vista hará lo correcto.
- ya sabes ... separación básica de preocupaciones.
¿POR QUÉ "habilitado (verdadero / falso)"?
Porque está integrado. Porque el botón respetará su estado (y si tiene una lista de estado correcta, cambiará la apariencia para usted y porque siempre será lo que espera). Además, porque es más fácil probar un presentador lleno de burlas, que una actividad completa que puede crecer para siempre en el código.
La forma estándar de evitar clics múltiples es guardar la última hora en la que se hizo clic y evitar los otros clics del botón en 1 segundo (o en cualquier lapso de tiempo). Ejemplo:
// 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.
}
...
}
.
.
.
}
Mi sugerencia es presionar cada botón antes de ejecutar cualquier otro código, use el método hasFocus (). Solo una vista puede tener foco en un momento dado, así que esto evitará que pueda hacer clic en ambos
Puede probar mi pequeña biblioteca, proporciona exactamente lo que quiere usando el mismo enfoque que la solución de Shivanand. https://github.com/RexLKW/SClick
Una "Mejor" práctica es usar el OnClickListener así ->
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);
});
Esto debería solucionar el problema y es una manera bastante simple de manejar las cosas
puede desactivar el toque múltiple en su aplicación usando este android:splitMotionEvents="false"
y android:windowEnableSplitTouch="false"
en su tema.
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
...
<item name="android:splitMotionEvents">false</item>
<item name="android:windowEnableSplitTouch">false</item>
</style>