2012-06-12 10 views
5

Mi problema es similar al this 2 year old question, solo estoy publicando el mismo problema para obtener las respuestas actualizadas, ya que muchas cosas han cambiado en dos años.¿Cómo puedo mostrar un diálogo sobre la actividad actualmente visible en android?

Estoy desarrollando una aplicación para dispositivos GingerBread +, tengo muchas actividades y en el fondo recibo algunos datos del servidor. Ahora, en función de esos datos, en algunos casos necesito mostrar un Dialog al usuario. El problema es ¿Cómo puedo saber cuál es la actividad más avanzada?

Lo he intentado, he intentado dar el getApplicationContext() mientras Dialog creación, sin embargo, que no está funcionando. Lanzando alguna excepción.

¿Una solución? (Realmente lo odio), Una solución podría ser realizar un seguimiento de la actividad actualmente visible al tener una variable en la clase Application y configurarla en onResume() de cada actividad. Realmente no quiero hacer esto libro de mantenimiento si su son formas más inteligentes para lograr esto y estoy seguro de su son formas más inteligentes para lograr esto,

Mi pregunta es sencilla,
¿Cómo puedo mostrar un cuadro de diálogo en ¿Actividad actualmente visible?, para que pueda dar esa referencia al AlertDialog.Builder, que creo que hará mi trabajo ... Si no es así, ¿Cómo puedo mostrar un diálogo en la parte superior de la actividad?

Editar, creo un diálogo sencillo usando siguiente código privada View.OnClickListener cancelClickListener = new OnClickListener() {

@Override 
    public void onClick(View v) { 
     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
       LoginActivity.this); 

     // set title 
     alertDialogBuilder.setTitle("Roobroo will exit.."); 

     // set dialog message 
     alertDialogBuilder 
       .setMessage("Are you sure you want to exit ?") 
       .setCancelable(false) 
       .setPositiveButton("Yes", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int id) { 
           // if this button is clicked, close 
           // current activity 
           LoginActivity.this.finish(); 
          } 
         }) 
       .setNegativeButton("No", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int id) { 
           // if this button is clicked, just close 
           // the dialog box and do nothing 
           dialog.cancel(); 
          } 
         }); 

     // create alert dialog 
     AlertDialog alertDialog = alertDialogBuilder.create(); 

     // show it 
     alertDialog.show(); 
     // TODO Write the code to exit from the app, (gracefull exit) 
     Log.i(LOG_CAT, "Cancel Button is clicked"); 
    } 
}; 

Excepción usando AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder ( getApplicationContext()); me da siguiente excepción,

06-11 14:09:16.732: E/AndroidRuntime(1005): FATAL EXCEPTION: main 
06-11 14:09:16.732: E/AndroidRuntime(1005): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at android.view.ViewRoot.setView(ViewRoot.java:531) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at android.app.Dialog.show(Dialog.java:241) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at com.argusoft.roobrooAndroid.activities.LoginActivity$3.onClick(LoginActivity.java:127) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at android.view.View.performClick(View.java:2485) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at android.view.View$PerformClick.run(View.java:9080) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at android.os.Handler.handleCallback(Handler.java:587) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at android.os.Looper.loop(Looper.java:123) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
06-11 14:09:16.732: E/AndroidRuntime(1005):  at dalvik.system.NativeStart.main(Native Method) 
+0

¿Qué excepción obtienes con getApplicationContext()? –

+0

por favor muestra un código. ¿Qué has hecho hasta ahora? – Dhruvisha

+0

Bueno, puede traer una actividad adicional que sea transparente y pueda mostrar un diálogo sobre esa actividad. Escriba todos los códigos para el diálogo en la actividad y cada vez que necesite mostrar el diálogo simplemente lleve la actividad al frente. – Rasel

Respuesta

5

Prueba este si le ayuda a:

1. Crear una Activity con transparent theme and no title.

2. En onCreate() defina su alert dialog.

3. Iniciando esta actividad desde broadcastReceiver mostrará alert dialog.

2

Simplemente puede crear una Activity y establecer su tema a Dialog en manifest así:

<activity 
     android:name="Dialog_MsgBox" 
     android:launchMode="singleInstance" 
     android:theme="@android:style/Theme.Dialog" > 
    </activity> 

también establece launchMode a singleInstance para evitar varias instancias de la actividad. usa el diseño que quieras usar para tu diálogo.

Para configurar diferentes mensajes, coloque mensajes de cadena adicionales y obténgalos Dialog (activity) start up.

+0

suena bien .. .pero se mostrará siempre en la actividad actualmente visible ... – aProgrammer

+0

Sí, se mostrará en la actividad actualmente visible. –

1

He resuelto este problema haciendo que

private Activity currentOnTopActivity; 

en mi clase de aplicaciones, que activa/desactiva esta variable dentro onResume() y onPause() de cada actividad.

Una vez hecho esto, cada vez que quiero mostrar un diálogo para el usuario, sólo que después de ...

if (currentOnTopActivity!=null && !currentOnTopActivity.isFinishing()) { 
       currentOnTopActivity.runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         String msg = "Some msg"; 
         AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(currentOnTopActivity); 
         AlertDialog invitationDialog = null; 

         // set title 
         alertDialogBuilder.setTitle("Title "); 

         // set dialog message 
         alertDialogBuilder.setMessage(msg).setCancelable(false).setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
             // do something       } 
         }); 

         // create alert dialog 
         invitationDialog = alertDialogBuilder.create(); 

         // show it on UI Thread 
         invitationDialog.show(); 

        } 

       }); 
      } 

EDITAR para simplificar el proceso creé una MyActivity clase abstracta que se extiende y Actividad colocó las llamadas del colocador en el lado OnResume y OnPause de esta clase. Y todas las demás actividades de mi Aplicación simplemente extienden esta Super clase personalizada en lugar de Actividad. Esto también me da la flexibilidad de cambiar la lógica subyacente cada vez que obtengo la mejor solución posible.

+1

Estimado downvoter proporcione una mejor manera ... Todavía estoy esperando la mejor respuesta ... – aProgrammer

Cuestiones relacionadas