2012-06-12 4 views
5

Mein Problem ist ähnlich wie this 2 year old question, ich bin gerade wieder das gleiche Problem zu posten, um die aktualisierten Antworten zu erhalten, da sich viel in zwei Jahren geändert hat.Wie kann ich einen Dialog auf Aktuelle Aktivität auf Android anzeigen?

Ich entwickle für eine App für GingerBread + Geräte, ich habe viele Aktivitäten und im Hintergrund erhalte ich einige Daten vom Server. Basierend auf diesen Daten muss ich in einigen Fällen dem Benutzer einen Dialog zeigen. Problem ist: Woher weiß ich, welche aktuelle Front die meiste Aktivität ist?

Was ich versuchte, Ich habe versucht, die getApplicationContext() während Dialog Schöpfung zu geben, aber das funktioniert nicht. Eine Ausnahme werfen.

Eine Lösung? (Ich hasse es wirklich), Eine Lösung könnte sein, die aktuell sichtbare Aktivität zu verfolgen, indem Sie eine Variable in Application Klasse, und setzen Sie es auf onResume() von jeder Aktivität. Ich mag wirklich nicht, diese Buchhaltung tun, wenn ihre intelligentere Wege, dies zu erreichen, und ich bin sicher, dass sie sind intelligentere Wege, dies zu erreichen,

Meine einfache Frage ist,
Wie kann ich einen Dialog angezeigt auf Derzeit sichtbare Aktivität?, So dass ich diesen Verweis auf den AlertDialog.Builder geben kann, der meiner Meinung nach meine Aufgabe erledigen wird .. Wenn nicht als Wie kann ich einen Dialog auf oberste Aktivität anzeigen?

Bearbeiten, ich erstellen einen einfachen Dialog folgenden Code privaten 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"); 
    } 
}; 

Exception mit AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder ( getApplicationContext()); folgende Ausnahme gibt mir,

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

Welche Ausnahme erhalten Sie mit getApplicationContext()? –

+0

bitte Code anzeigen. Was hast du bisher gemacht? – Dhruvisha

+0

Nun, Sie können eine zusätzliche Aktivität, die transparent ist, bringen und Dialog für diese Aktivität zeigen. Schreiben Sie alle Codes für den Dialog in der Aktivität und wann immer Sie Dialog zeigen müssen, bringen Sie die Aktivität in den Vordergrund. – Rasel

Antwort

5

dies versuchen, wenn es Ihnen hilft:

1. erstellen Activity mit transparent theme and no title.

2. In onCreate() definieren Sie Ihre alert dialog.

3. Beim Starten dieser Aktivität von broadcastReceiver wird alert dialog angezeigt.

2

einfach können Sie eine Activity und setzen das Thema zu Dialog in manifest wie folgt erstellen:

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

auch launchMode-singleInstance setzen mehrere Instanz von Aktivität zu verhindern. Verwenden Sie das Layout, das Sie für Ihren Dialog verwenden möchten.

Um verschiedene Nachrichten einzustellen, legen Sie zusätzliche String-Nachrichten und erhalten Sie bei Ihnen Dialog (Aktivität) starten.

+0

klingt gut .. Aber das wird immer angezeigt bei Momentan sichtbare Aktivität ... – aProgrammer

+0

Ja, es wird angezeigt auf Momentan sichtbare Aktivität. –

1

löste ich dieses Problem durch

private Activity currentOnTopActivity; 

in meiner Application-Klasse mit, ich gesetzt/zurückgesetzt diese Variable innerhalb onResume() und onPause() jeder Aktivität.

das getan, Immer, wenn ich einen Dialog mit dem Benutzer angezeigt werden soll, ich nur noch folgende ...

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 Um den Prozess zu vereinfachen ich eine abstrakte Klasse MyActivity geschaffen, die Aktivität erstreckt und platziert die Setter-Aufrufe in Side OnResume und OnPause dieser Klasse. Und alle anderen Aktivitäten meiner Anwendung erweitern einfach diese benutzerdefinierte Superklasse anstelle von Aktivität. Dies gibt mir auch die Flexibilität, die zugrundeliegende Logik zu ändern, wann immer ich die bestmögliche Lösung erhalte.

+1

Lieber Downvoter, bitte bieten Sie einen besseren Weg ... Ich warte immer noch auf die beste Antwort ... – aProgrammer

Verwandte Themen