Evento de clic transferido a la siguiente Actividad iniciada
Estoy afectado por la manipulación de eventos extraños en Android. Mi problema es que si el usuario hace clic en un Button
muchas veces realmente rápido, el evento se pone en cola y se transfiere más a la siguiente Activity
.
Aquí hay un ejemplo:
- Android.os.FileUriExposedException: file.jpg expuesto más allá de la aplicación a través de ClipData.Item.getUri ()
- Las vistas de Android amplían la animación
- Haga que un botón de Android cambie el fondo al hacer clic en XML
- Android: El botón OnClickListener no funciona
- Android no puede encontrar mi método onClick
<Button android:id="@+id/btn_home_show" style="@style/main_buttons" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/home_label_show" />
Activity
onClick
:
public void onClick(View view) { int viewId = view.getId(); if (viewId == EXPECTED_VIEW_ID) { Intent intent = new Intent(this, CarouselActivity.class); startActivity(intent); } }
En mi Activity
tengo otro elemento que se puede hacer clic con las mismas coordenadas en la pantalla.
Lo que sucede es que si el usuario hace clic muy rápido en el Button
entonces este evento de clic se transfiere a la actividad recién iniciada y se produce otra manipulación onClick
.
He intentado 2.3.3 & 2.3.5 versión de marco y el comportamiento es el mismo. ¿Algunas ideas?
- Toast dentro del método onClick en Fragment
- Usando un bucle para establecer los botones enclicklistener
- El cajón de navegación inhabilita la vista trasera cuando el cajón está abierto
- RecyclerView onItemClicked devolución de llamada
- ¿Cómo pasar el evento onClick a su padre en Android?
- OnClickListener en pestañas no funciona
- cambiar el color de fondo de ListView desactiva el color de resaltado
- ¿Por qué OnClickListener en un ViewHolder no funciona?
Una solución simple sería agregar un valor booleano que determina si se maneja o no un clic y luego crear un hilo que duerme luego establece el valor en true
public void onClick(View view) { if (inputAllowed) { //do stuff } } boolean inputAllowed = true; private class ButtonDelay extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { } @Override protected Void doInBackground(Void... params) { try { inputAllowed = false; Thread.sleep(500); inputAllowed = true; } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(final Void unused) { } }
Y inicie el asynctask inmediatamente en onCreate (). En cuanto a por qué sucede esto supongo que la nueva actividad ha creado el nuevo botón y ya que el usuario está haciendo clic rápidamente en él registra estos clics.
Su problema no es que el evento de clic se transfiera a la nueva actividad. El problema es que después del primer clic que está haciendo su nueva actividad comenzará a aparecer. Si el usuario vuelve a hacer clic durante algunas veces, su nueva actividad se carga y recibe el clic tal como se supone que debe hacerlo. Supongo que está bloqueando la UI-Thread durante su cambio de actividad y debido a que el usuario no está seguro de si ha pulsado el botón e intenta hacer clic de nuevo.
Trate de fijar su Actividad de conmutación. Sólo podría mostrar una superposición con un Spinner que captura todos los eventos de clic hasta que esté listo para mostrar la interfaz de usuario correcta de la actividad. De esta manera el usuario se da cuenta de que algo sucedió y dejará de hacer clic y esperar a que el hilandero a desaparecer.
- Comportamiento inesperado de StreamTokenizer en Android
- Múltiples proyectos de Android con el mismo submódulo GIT