2012-06-21 19 views
6

Digamos que tenemos dos actividades, Activity1 y Activity2.android - Cómo mostrar el cuadro de diálogo después de que termina la actividad

En el método onClick de Actividad1(), tenemos una llamada para iniciar la actividad 2, si se pulsa un botón determinado:

Intent myIntent = new Intent(Activity1.this, Activity2.class); 
Activity1.this.startActivity(myIntent); 

Después de acabado() es llamado en Actividad2 y Actividad1 se reanudó, necesito una diálogo para mostrar en Activity1, tan pronto como se reanude.

Antes, simplemente llamado showDialog método (id) en el mismo bloque de onClick de Activity1():

public void onClick(View v) { 
    if(v == addHole){ 
    //... 
    Intent myIntent = new Intent(Activity1.this, Activity2.class); 
    Activity1.this.startActivity(myIntent); 
    showDialog(END_DIALOG_ID); 
    } 
} 

La cuestión es, después de Activity1 reanuda, el diálogo correspondiente a END_DIALOG_ID no es visible, pero el la pantalla se oscurece y no responde (como si el cuadro de diálogo estuviera presente), hasta que se presiona la tecla Atrás.

He intentado poner la llamada showDialog() en los métodos activityResume() y onRestart(), pero ambos bloquean el programa.

También he intentado crear un método AsyncTask en Activity2, con la llamada showDialog() en su onPostExecute(), pero el diálogo no está visible en Activity2.

private class ShowDialogTask extends AsyncTask<Void, Void, Integer> { 
    /** The system calls this to perform work in a worker thread and 
    * delivers it the parameters given to AsyncTask.execute() */ 
    protected Integer doInBackground(Void... id) { 
     //do nothing 
     return END_DIALOG_ID; 
    } 

    /** The system calls this to perform work in the UI thread and delivers 
    * the result from doInBackground() */ 
    protected void onPostExecute(Integer id) { 
     super.onPostExecute(id); 
     showDialog(id); 

    } 
} 

Ahora estoy tratando de poner en práctica esta llamando

Activity1.this.startActivityForResult(myIntent, END_DIALOG_REQUEST); 

con métodos onActivityResult() de Actividad1 setResult correspondiente() y, pero parece que debe haber una mejor práctica para la implementación de este. Todo lo que necesito es tener un cuadro de diálogo que se muestre en el acabado de Activity2.

Gracias por cualquier ayuda que pueda proporcionar.

+1

Iba a sugerir startActivityForResult y onActivityResult, pero pareces haberlo descubierto por tu cuenta. Para mí, esa es la forma más directa de lograr lo que quieres. – mportuesisf

Respuesta

7

Como sugiere, llame al startActivityForResult al iniciar Activity2. Luego, anule onActivityResult y verifique RESULT_OK, y luego muestre su cuadro de diálogo. Esa es una práctica perfectamente aceptable para hacer lo que estás buscando hacer.

+0

Gracias. Esta parece ser la mejor respuesta, ya que anular 'onResume()' hace que el diálogo se muestre la primera vez que se inicia Activity1, y 'onRestart()' hace que se muestre el diálogo si la aplicación pierde el foco. El uso de 'startActivityForResult' parece ser mejor solo para mostrar el diálogo cuando Activity2 finaliza (o se cancela mediante la tecla BACK). ¡Gracias de nuevo! – avoyles

+0

De nada. Otra cosa a tener en cuenta es que se llamará a 'onResume() 'si el usuario navega a otra aplicación (teléfono, mensajería, lo que sea) y luego vuelve a su actividad. – wsanville

+0

Hmm, sí. Ese es un buen punto.Pero creo que 'startActivityForResult' funcionará mejor, ya que solo quiero que se muestre el diálogo después de que Activity2 finaliza y Activity1 entra en foco. El diálogo es para obtener una marca de tiempo, y debe ser en el momento de la transición de Activity2 de nuevo a Activity1. – avoyles

0

Puede utilizar onResume método (si u'r sin mirar nada de actividad2)

@Override 
public void onResume(){ 
    super.onResume(); 
    //do something 
} 
+0

El uso de showDialog() en onResume() también hace que el diálogo se muestre cuando se crea Activity1 por primera vez. – avoyles

+0

Sin embargo, el uso de onRestart en lugar de onResume parece funcionar como se desee. Me olvidé de llamar a 'super.onRestart()' cuando lo intenté antes. ¿En qué casos podría tener que preocuparme si Reiniciar() se llama después de que finaliza la Actividad2? – avoyles

+0

Necesita asegurarse de que cada variable que va a utilizar en 'onRestart()' ya se haya iniciado/reiniciado o arrojará 'NullPointerException' – Hein

0

tengo que volver a la actividad de las raíces - MainActivity, lo que podría cerrar varias actividades, y luego muestro de diálogo. Así que he elegido una forma alternativa.

MyDialog { 
    public static synchronized void planToShowDialog(String info) { 
     if (info != null) { 
      saveInfoToPreferences(info); 
     } 
    } 

    public static synchronized void showDialogIfNecessary(Context context) { 
     String info = readInfoFromPreferences(); 
     if (info != null) { 
      saveInfoToPreferences(null); // Show dialog once for given info. 
      new MyDialog(context, info).show(); 
     } 
    } 

    private static String readInfoFromPreferences() { 
     //... 
    } 

    private static void saveInfoToPreferences(String info) { 
     //... 
    } 
} 

I llaman MyDialog.showDialogIfNecessary() desde MainActivity.onPostResume método().

Cuestiones relacionadas