2012-06-12 8 views
5

Mój problem jest podobny do this 2 year old question, po prostu ponownie zamieszczam ten sam problem, aby uzyskać zaktualizowane odpowiedzi, ponieważ wiele zmieniło się w ciągu dwóch lat.Jak mogę wyświetlić okno dialogowe Na bieżąco widoczną aktywność na Androidzie?

Pracuję nad aplikacją dla urządzeń GingerBread +, mam wiele działań iw tle otrzymuję dane z serwera. Teraz, w oparciu o te dane, w niektórych przypadkach muszę pokazać użytkownikowi: Dialog. Problem polega na tym, w jaki sposób mogę sprawdzić, który z obecnych działań jest największy?

Co próbowałem, Próbowałem dając getApplicationContext() while Dialog tworzenie jednak, że nie działa. Rzucanie wyjątku.

Rozwiązanie? (Naprawdę go nienawidzę), Rozwiązaniem może być śledzenie aktualnie widocznej aktywności poprzez posiadanie zmiennej w klasie Application i ustawienie jej na onResume() dla każdej aktywności. I naprawdę nie chcę robić tego księgowości jeśli ich są mądrzejsze sposoby osiągnięcia tego celu i jestem pewien ich są mądrzejsze sposoby osiągnięcia tego celu,

Moje pytanie jest proste,
Jak mogę wyświetlić okno na Aktualnie widoczna aktywność?, tak, że mogę podać to odwołanie do AlertDialog.Builder, który moim zdaniem wykona moją pracę. Jeśli nie, to Jak mogę wyświetlić okno dialogowe na najwyższym Aktywności?

Edycja tworzę prosty dialog używając następującego kodu prywatny 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"); 
    } 
}; 

Wyjątek użyciu AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder ( getApplicationContext()); daje mi następujący wyjątek,

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

Jaki wyjątek uzyskuje się dzięki funkcji getApplicationContext()? –

+0

proszę pokazać kod. Co dotychczas zrobiłeś? – Dhruvisha

+0

Cóż, możesz przynieść dodatkową aktywność, która jest przezroczysta i może wyświetlać okno dialogowe na temat tej aktywności. Wszystkie kody dla okna dialogowego w działaniu i kiedy tylko chcesz wyświetlić okno dialogowe, po prostu przenieś aktywność z przodu. – Rasel

Odpowiedz

5

spróbować tego, czy to pomaga:

1. Tworzenie Activity z transparent theme and no title.

2. W onCreate() zdefiniować alert dialog.

Rozpoczęcie tej działalności z broadcastReceiver wyświetli alert dialog.

2

Wystarczy można utworzyć Activity i ustawić jej motyw do Dialog w manifest tak:

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

również ustawić launchModesingleInstance aby zapobiec wielokrotne wystąpienie działania. użyj dowolnego układu, którego chcesz użyć w oknie dialogowym.

Aby ustawić różne komunikaty, umieść dodatkowe wiadomości tekstowe i uruchom je. Uruchom okno dialogowe (aktywność).

+0

brzmi dobrze .. ., ale będzie to zawsze wyświetlane w polu Aktualnie widoczna aktywność ... – aProgrammer

+0

Tak, pokaże się w polu Aktualnie widoczna aktywność. –

1

I rozwiązać ten problem poprzez

private Activity currentOnTopActivity; 

w mojej klasie Application ustawić/zresetować tę zmienną wewnątrz onResume() i onPause() każdego działania.

tego zrobić, gdy chcę, aby wyświetlić okno dialogowe do użytkownika, czy po prostu ...

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 Aby uprościć proces stworzyłem klasę abstrakcyjną MyActivity które przedłużają działanie i umieścił wywoływanie ustawiające po stronie OnResume i OnPause tej klasy. A wszystkie inne działania mojej aplikacji po prostu rozszerzają tę niestandardową super klasę zamiast działania. Daje mi to również możliwość zmiany logiki bazowej za każdym razem, gdy otrzymam najlepsze możliwe rozwiązanie.

+1

Drodzy Dniewcy proszę podać lepszy sposób ... Wciąż czekam na najlepszą odpowiedź ... – aProgrammer

Powiązane problemy