studio reales proyectos programacion introducción incluye herramientas fundamentos fuente código con avanzado aplicaciones android button onclicklistener

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":

  1. Haga lo mismo, pero ponga la lógica en su Presentador.
  2. Su presentador decidirá si la acción del "botón" se ha activado.
  3. Su presentador dirá su "vista": enableMyButton(); o disableMyButton() dependiendo.
  4. Tu vista hará lo correcto.
  5. 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>