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?

gracias

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 .

  • Diálogo personalizado de la ruleta para Android
  • Diálogo de alerta personalizada no centrado verticalmente en Android
  • Tener la aplicación ejecutándose sobre otra aplicación
  • Cambiar el color del botón en AlertDialog
  • Diálogo personalizado independiente de la versión de la plataforma con el icono, el título y los botones estándar
  • ¿Cómo posiciono el cuadro de diálogo personalizado en coordenadas específicas?
  • Cómo DialogFragment afecta el ciclo de vida de la actividad de llamada
  • ¿Por qué esto NO provoca un colapso? Estoy actualizando la interfaz de usuario de otro hilo
  • Cómo hacer que un cuadro de diálogo de PreferenciaActividad abra una ventana de diálogo para establecer una preferencia personalizada
  • EditText se expande demasiado lento dentro de AlertDialog en android
  • ¿Cómo mostrar un diálogo en un widget?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.