2012-06-12 13 views
5

Il mio problema è simile a this 2 year old question, sto solo postando lo stesso problema per ottenere le risposte aggiornate, poiché molto è cambiato in due anni.Come posso visualizzare una finestra di dialogo su Attività attualmente visibile su Android?

Sto sviluppando un'applicazione per dispositivi GingerBread +, ho molte attività e in background ricevo alcuni dati dal server. Ora, in base a questi dati, in alcuni casi ho bisogno di mostrare un Dialog all'utente. Il problema è Come faccio a sapere quale è la maggior parte delle attività correnti?

Quello che ho cercato, ho provato dando il getApplicationContext() mentre Dialog creazione, tuttavia, che non funziona. Lanciare qualche eccezione.

Una soluzione? (Lo odio davvero), Una soluzione potrebbe essere quella di tenere traccia dell'attività attualmente visibile avendo una variabile nella classe Application e impostandola su onResume() di ogni attività. Io davvero non voglio fare questo contabilità se loro sono modi più intelligenti per raggiungere questo obiettivo e sono sicuro loro sono modi più intelligenti per raggiungere questo obiettivo,

La mia domanda semplice è,
Come posso visualizzare una finestra su Attività attualmente visibile?, In modo che io possa dare quel riferimento all'AlertDialog.Builder, che penso svolgerà il mio lavoro .. Se non di Come posso visualizzare una finestra di dialogo sull'attività più in alto?

Edit, crea un dialogo semplice utilizzando seguente codice privato 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"); 
    } 
}; 

Eccezione utilizzando AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder ( getApplicationContext()); mi dà seguente eccezione,

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

Quale eccezione si ottiene con getApplicationContext()? –

+0

si prega di mostrare un po 'di codice. Che cosa hai mai fatto finora? – Dhruvisha

+0

Bene, puoi portare un'attività extra che è trasparente e può mostrare la finestra di dialogo su quell'attività. Scrivi tutti i codici per la finestra di dialogo nell'attività e ogni volta che devi mostrare la finestra di dialogo porta l'attività in primo piano. – Rasel

risposta

5

Prova questo se ti aiuta:

1. Creare un Activity con transparent theme and no title.

2. In onCreate() definire il alert dialog.

3. L'avvio di questa attività da broadcastReceiver mostrerà lo alert dialog.

2

Semplicemente è possibile creare un Activity e impostare il suo tema di Dialog in manifest come questo:

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

anche impostare launchMode-singleInstance per evitare più istanze di attività. usa qualunque layout tu voglia usare per la tua finestra di dialogo.

Per impostare messaggi diversi, inserire messaggi di stringa aggiuntivi e richiamarli all'avvio della finestra di dialogo (attività).

+0

suona bene .. . ma sarà sempre visualizzato su Attività attualmente visibile ... – aProgrammer

+0

Sì, verrà mostrato nell'attività attualmente visibile. –

1

Ho risolto questo problema facendo

private Activity currentOnTopActivity; 

nella mia classe di applicazione, ho impostato/reset questa variabile all'interno onResume() e onPause() di ogni attività.

Fatto questo, ogni volta che voglio mostrare una finestra di dialogo per l'utente, solo che dopo ...

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(); 

        } 

       }); 
      } 

EDIT per semplificare il processo ho creato un MyActivity classe astratta che si estende attività e ha piazzato le chiamate del setter su OnResume e OnPause di questa classe. E tutte le altre attività della mia Applicazione estendono semplicemente questa super classe personalizzata invece di Attività. Questo mi dà anche la flessibilità di cambiare la logica sottostante ogni volta che ottengo la migliore soluzione possibile.

+1

Cari Downgoter, per favore, fornite un modo migliore ... Sto ancora aspettando la migliore risposta ... – aProgrammer

Problemi correlati