Estoy tratando de evitar que la actividad de carga dos veces si me presione dos veces el botón inmediatamente después del primer clic.
Tengo una actividad que se carga en el clic de un botón, dicen
myButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
//Load another activity
}
});
Ahora debido a que la actividad se ha cargado llamadas de la red, se necesita un poco de tiempo para cargar (MVC). Yo sí muestran una carga de la vista de esto, pero si yo pulse el botón dos veces antes de eso, puedo ver la actividad que se está cargando dos veces.
Hacer cualquiera sabe cómo para evitar esto?
- Usted puede deshabilitar el botón después de la apertura de la actividad…y cuando la actividad acabado,vuelve a activar…u puede detectar el final de la segunda actividad llamando onActivityResult función
- Deshabilitar el botón cuando se hace clic y volver a activarlo más tarde sólo cuando se desea que el botón se hace clic de nuevo.
- la desactivación no funciona de una manera sencilla, si la siguiente afirmación es un poco largo proceso o de inicio de actividad… Para deshabilitar el botón debe tener para crear un subproceso independiente…
- Si golpear a la misma API dos veces se refieren a continuación: techstricks.com/avoid-multiple-requests-when-using-volley
- Posibles duplicados de botón Evitar múltiples rápida clics
En el botón de escucha de eventos, deshabilitar el botón y mostrar otra actividad.
Reemplazar
onResume()
para volver a habilitar el botón.Agregar esto a su
Activity
definición enAndroidManifest.xml
…Por ejemplo:
android:launchMode = "singleTop"
, que logra el efecto sin romper Android multitarea. La documentación indica que la mayoría de las aplicaciones no deben utilizar elsingleInstance
opción.Puede utilizar la intención banderas como este.
Va a hacer sólo una actividad abierta en la parte superior de la historia de la pila.
android:launchMode = "singleTop"
, de esta manera se resuelve sin tener que añadir la bandera a cada Intención.Ya que no me permiten comentar en otras respuestas, tengo que contaminan este hilo con una nueva respuesta.
Común de las respuestas de la actividad «se abre dos veces» problema y mis experiencias con estas soluciones (Android 7.1.1):
EDIT: Esto fue para el inicio de las actividades con startActivity(). Cuando se utiliza startActivityForResult() necesito para establecer FLAG_ACTIVITY_SINGLE_TOP y FLAG_ACTIVITY_CLEAR_TOP.
Digamos que @wannik es correcto pero si tenemos más de 1 botón de llamada de una misma acción escucha y haga clic en dos botones una vez casi el mismo tiempo antes de comenzar la siguiente actividad…
Por lo que es bueno si usted tiene campo
private boolean mIsClicked = false;
y en el oyente:Y
onResume()
necesitamos para volver al estado:¿Cuál es la deifference entre mi y @wannik la respuesta?
Si usted establezca enabled a false en el detector de llama a ver otro botón usando el mismo oyente todavía estará habilitada. Así que para estar seguro de que la escucha de la acción no es llamado dos veces usted necesita tener algo global que desactiva todos los llamamientos de la escucha(no importa si es nueva instancia o no)
¿Cuál es la diferencia entre mi respuesta y a los demás?
Que están pensando en la manera correcta, pero ellos no están pensando para el futuro regreso a la misma instancia de la actividad de llamadas 🙂
synchronized(mIsClicked) {...}
así a ser 100% seguro.private
significa que yo soy totalmente responsable de ella, pero no me ciegamente decirle a alguien a hacer lo mismo, especialmente si la pregunta es sobre algo tan básico.Uso de instancia única para evitar la actividad para invocar dos veces.
Era sólo trabajo para mí cuando
startActivity(intent)
android:launchMode = "singleInstance"
en el archivo de Manifiesto de la etiqueta de actividad?Creo que van sobre cómo solucionar el problema de la manera equivocada. Generalmente es una mala idea para una actividad de hacer ejecutar las solicitudes web en cualquiera de sus inicio del ciclo de vida de los métodos (
onCreate()
,onResume()
, etc). Realmente estos métodos deben ser simplemente utiliza para instanciar e inicializar los objetos de su actividad que se va a utilizar y por lo tanto debe ser relativamente rápido.Si necesita realizar una solicitud web, a continuación, hacer esto en un subproceso en segundo plano de su recién lanzado actividad (y mostrar el diálogo de carga en la nueva actividad). Una vez que el fondo subproceso de solicitud completa se puede actualizar la actividad y ocultar el cuadro de diálogo.
Esto significa, entonces, la nueva actividad debe obtener inicia de inmediato y evitar la doble clic de ser posible.
Espero que esta ayuda:
Otros muy muy fácil solución si usted no desea utilizar
onActivityResult()
es deshabilitar el botón durante 2 segundos (o el tiempo que quieras), no es lo ideal, pero se puede solucionar en parte el problema es que algunos de los casos y el código es sencillo:Para esta situación, voy a ir por uno de los dos se acercó,
singleTask
en manifest.xml O una bandera en la Actividad delonResume()
&onDestroy()
métodos respectivamente.Para la primera solución: yo prefiero usar
singleTask
para la actividad en el manifiesto, en lugar desingleInstance
, como por el uso desingleInstance
me di cuenta de que en algunas ocasiones la actividad de creación de una nueva instancia independiente por sí mismo cual resultado de dos aplicaciones independientes de la ventana en la ejecución de aplicaciones en bcakground y extra además de las asignaciones de memoria que el resultado sería una muy mala Experiencia del Usuario cuando el usuario abre la vista de aplicaciones para elegir alguna aplicación para reanudar.Así, la mejor manera es tener la actividad definida en el manifest.xml como la siguiente:
puede comprobar la actividad de lanzamiento de los modos de aquí.
Para la segundo solución, tienes que definir una variable estática o una preferencia de la variable, por ejemplo:
y desde el otro lado cuando se desea iniciar esta actividad, sólo de verificación:
Simplemente mantener una bandera en el botón de método onClick como:
public boolean oneTimeLoadActivity = false;
Si usted está usando onActivityResult, usted podría usar una variable para guardar el estado.
Obras en la parte de atrás del botón presionado demasiado porque el código de solicitud es devuelta en el evento.
Utilizar un
flag
conjunto de variables queto true
,Compruebe si su verdadero sólo
return
más realizar la Actividad Llamada.También puede utilizar setClickable(falso) uno de ejecutar la Actividad Llamada
perform click; wait; flg = false;
para cuando volvamosSólo podría reemplazar startActivityForResult y el uso variable de instancia:
//variable para el seguimiento de eventos en tiempo
2.En onClick comprobar que si la hora actual y por último haga clic en la diferencia de tiempo son menos de lo segundo, entonces no hagas nada(volver)
los demás van para el evento click
Que usted puede probar esto también