Cómo cerrar un cuadro de diálogo después de ciertos segundos de inactividad?
Tengo una aplicación que contiene un diálogo
Quiero cerrar este cuadro de diálogo después de x segundo, cuando el usuario no tiene ninguna interacción con la aplicación, como volumen popup búsqueda popup (que está abierto cuando el botón de volumen hace clic, y cerró después de 2 segundo de inactividad). ¿Cuál es la forma más sencilla de implementar esto?
- ¿Cómo puedo crear DialogFragment de ListActivity en Android?
- Cómo obtener la alerta predeterminada Dialog en android tiene un tema negro
- La actividad de diálogo se oculta bajo la pantalla de llamada cuando el bloqueo seguro está activado, android
- En Android, se muestra cómo detectar un diálogo del sistema (opciones de energía, aplicaciones recientes, batería baja ...).
- Android: especificación del tema personalizado para el diálogo personalizado AlertDialog.Builder envuelve el contenido en un diálogo
gracias
- Start Dialog para que el resultado devuelva el valor a la actividad principal
- Tostas versus cuadros de diálogo: ¿cuál usar cuando?
- Añadir desplazamiento rápido a una lista de desplazamiento AlertDialog.Builder
- Android Mejor forma de evitar Diálogos para descartar después de una rotación del dispositivo
- Problemas con el show de alertdialog en el fragmento android
- Asynch hilo que detiene el hilo principal de interfaz de usuario
- Diálogo de alerta simple de Android
- Mostrar diálogo de la rueda giratoria mientras carga datos en Android
Por ejemplo, puede utilizar un controlador y llamar a su método .removeCallbacks () y .postDelayed () cada vez que el usuario interactúa con el diálogo.
Tras una interacción, el método .removeCallbacks () cancelará la ejecución de .postDelayed (), y justo después de eso, u iniciará un nuevo Runnable con .postDelayed ()
Dentro de este Runnable, usted podría cerrar el diálogo.
// a dialog final Dialog dialog = new Dialog(getApplicationContext()); // the code inside run() will be executed if .postDelayed() reaches its delay time final Runnable runnable = new Runnable() { @Override public void run() { dialog.dismiss(); // hide dialog } }; Button interaction = (Button) findViewById(R.id.bottom); final Handler h = new Handler(); // pressing the button is an "interaction" for example interaction.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { h.removeCallbacks(runnable); // cancel the running action (the hiding process) h.postDelayed(runnable, 5000); // start a new hiding process that will trigger after 5 seconds } });
Para el seguimiento de la interacción del usuario, puede utilizar:
@Override public void onUserInteraction(){ h.removeCallbacks(runnable); // cancel the running action (the hiding process) h.postDelayed(runnable, 5000); // start a new hiding process that will trigger after 5 seconds }
Que está disponible en su actividad.
Me gusta hacer esto con AsyncTask:
class ProgressDialogTask extends AsyncTask<Integer, Void, Void> { public static final int WAIT_LENGTH = 2000; private ProgressDialog dialog; public ProgressDialogTask(Activity activity) { dialog = new ProgressDialog(activity); } @Override protected void onPreExecute() { dialog.setMessage("Loading"); } @Override protected Void doInBackground(final Integer... i) { long start = System.currentTimeMillis(); while(!isCancelled()&&System.currentTimeMillis()-start< WAIT_LENGTH){} return null; } @Override protected void onPostExecute(final Void v) { if(dialog.isShowing()) { dialog.dismiss(); } } }
A continuación, disparar desde su actividad en el clic:
Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ProgressDialogTask task = new ProgressDialogTask(this); task.execute(0); } });
Si necesita una mejor precisión, también puede utilizar System.nanoTime ()
También soy nuevo en android, pero recomiendo crear un temporizador, y cuando digamos que el temporizador t es mayor o igual a 2, entonces usted hace algo. Parecería un poco como esto
if (t >= 2.0){ //Do whatever you want it to do }
Esto puede no funcionar para sus propósitos, pero es sólo algo que puede requerir menos líneas de código al final. (Como siempre digo, menos código es más código) Sé que temporizadores son básicamente fáciles de hacer, pero nunca he utilizado uno en una aplicación. No sabría específicamente cómo hacer el temporizador, pero estoy seguro de que puede encontrar un tutorial en youtube.
Esta es la pregunta que surgió cuando estaba buscando cosas sobre el tiempo de espera. He implementado una respuesta que utiliza AsyncTask
, Handler
y Runnable
. Estoy proporcionando mi respuesta aquí como una plantilla potencial para los buscadores de respuestas futuras.
private class DownloadTask extends AsyncTask<Void, CharSequence, Void> { //timeout timer set here for 2 seconds public static final int timerEnd = 2000; private Handler timeHandler = new Handler(); @Override protected void onPreExecute() { ProgressDialog dProgress = new ProgressDialog(/*Context*/); dProgress.setMessage("Connecting..."); dProgress.setCancelable(false); dProgress.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //Dismissing dProgress dialog.dismiss(); //Removing any Runnables timeHandler.removeCallbacks(handleTimeout); //cancelling the AsyncTask cancel(true); //Displaying a confirmation dialog AlertDialog.Builder builder = new AlertDialog.Builder(/*Context*/); builder.setMessage("Download cancelled."); builder.setCancelable(false); builder.setPositiveButton("OK", null); builder.show(); } //End onClick() }); //End new OnClickListener() dProgress.show(); } //End onPreExecute() @Override protected Void doInBackground(Void... params) { //Do code stuff here //Somewhere, where you need, call this line to start the timer. timeHandler.postDelayed(handleTimeout, timerEnd); //when you need, call onProgressUpdate() to reset the timer and //output an updated message on dProgress. //... //When you're done, remove the timer runnable. timeHandler.removeCallbacks(handleTimeout); return null; } //End doInBackground() @Override protected void onProgressUpdate(CharSequence... values) { //Update dProgress's text dProgress.setMessage(values[0]); //Reset the timer (remove and re-add) timeHandler.removeCallbacks(handleTimeout); timeHandler.postDelayed(handleTimeout, timerEnd); } //End onProgressUpdate() private Runnable handleTimeout = new Runnable() { public void run() { //Dismiss dProgress and bring up the timeout dialog dProgress.dismiss(); AlertDialog.Builder builder = new AlertDialog.Builder(/*Context*/); builder.setMessage("Download timed out."); builder.setCancelable(false); builder.setPositiveButton("OK", null); builder.show(); } }; //End Runnable() } //End DownloadTask class
Para aquellos algo nuevo en el uso de AsyncTask
, debe realizar un DownloadTask object
y llamar a .execute()
.
Por ejemplo:
DownloadTask dTaskObject = new DownloadTask(); dTaskObject.execute();
De hecho, también tomé este código más allá de lo que ves al tener todo mi código doInBackground()
realizado a través de una función, así que en realidad tuve que llamar a onProgressUpdate()
ya otras funciones usando el objeto DownloadTask
.