2012-06-12 63 views
5

Vấn đề của tôi tương tự như this 2 year old question, tôi chỉ đăng lại cùng một vấn đề để nhận được câu trả lời được cập nhật, vì rất nhiều đã thay đổi trong hai năm.Tôi làm cách nào để hiển thị hộp thoại trên Hoạt động hiện tại trên Android?

Tôi đang phát triển ứng dụng cho thiết bị GingerBread +, tôi có nhiều hoạt động và trong nền tôi nhận được một số dữ liệu từ máy chủ. Bây giờ dựa trên dữ liệu đó trong một số trường hợp, tôi cần hiển thị một số Dialog cho người dùng. Vấn đề là làm cách nào để biết hoạt động nào có mặt trước nhiều nhất?

Những gì tôi cố gắng, Tôi đã cố gắng đưa ra các getApplicationContext() khi Dialog sáng tạo, tuy nhiên đó không hoạt động. Ném một số ngoại lệ.

Giải pháp? (Tôi thực sự ghét nó), Một giải pháp có thể là theo dõi hoạt động hiện tại có thể nhìn thấy bằng cách đặt một biến trong lớp Application và đặt nó trên onResume() của từng hoạt động. Tôi thật sự không muốn làm cuốn sách lưu giữ này nếu họ là những cách thông minh hơn để đạt được điều này và tôi chắc chắn họ là những cách thông minh hơn để đạt được điều này,

câu hỏi đơn giản của tôi là,
Làm thế nào tôi có thể hiển thị một hộp thoại trên Hoạt động hiển thị hiện tại?, Vì vậy mà tôi có thể cung cấp cho tài liệu tham khảo để AlertDialog.Builder, mà tôi nghĩ rằng sẽ làm công việc của tôi .. Nếu không phải là Làm thế nào tôi có thể hiển thị một hộp thoại trên hoạt động trên cùng?

Chỉnh sửa, tôi có thể tạo một hộp thoại đơn giản sử dụng đoạn mã sau tin View.OnClickListener cancelClickListener = OnClickListener mới() {

@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 sử dụng AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder ( getApplicationContext()); mang lại cho tôi sau ngoại lệ,

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

Ngoại lệ bạn nhận được với getApplicationContext() là gì? –

+0

vui lòng hiển thị một số mã. Bạn đã làm gì cho đến nay? – Dhruvisha

+0

Vâng, bạn có thể mang đến một hoạt động bổ sung minh bạch và có thể hiển thị hộp thoại trên hoạt động đó. Viết tất cả mã cho hộp thoại trong hoạt động và bất cứ khi nào bạn cần hiển thị hộp thoại, hãy mang hoạt động ở phía trước. – Rasel

Trả lời

5

Hãy thử điều này nếu nó giúp bạn:

1. Tạo một Activity với transparent theme and no title.

2. Trong onCreate() xác định alert dialog của bạn.

3. Bắt đầu hoạt động này từ chương trình phát sóngNhận sẽ hiển thị alert dialog.

2

Đơn giản chỉ cần bạn có thể tạo một Activity và thiết lập chủ đề của nó để Dialog trong manifest như thế này:

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

cũng đặt launchMode-singleInstance để ngăn chặn nhiều trường hợp hoạt động. sử dụng bất kỳ bố cục nào bạn muốn sử dụng cho hộp thoại của mình.

Để đặt các tin nhắn khác nhau, hãy đặt các chuỗi tin nhắn bổ sung và đưa chúng vào bạn Hộp thoại (hoạt động) khởi động.

+0

nghe hay .. nhưng sẽ luôn được hiển thị trên Hoạt động hiện tại có thể nhìn thấy ... – aProgrammer

+0

Có, nó sẽ hiển thị trên Hoạt động hiển thị hiện tại. –

1

tôi giải quyết vấn đề này bằng cách

private Activity currentOnTopActivity; 

trong lớp ứng dụng của tôi, tôi đặt/thiết lập lại biến này bên onResume()onPause() của mỗi hoạt động.

Đó làm, Bất cứ khi nào tôi muốn hiển thị một hộp thoại cho người dùng, tôi chỉ sau ...

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 Để đơn giản hóa quá trình tôi đã tạo một MyActivity lớp trừu tượng mà mở rộng hoạt động và đặt các cuộc gọi setter ở bên OnResume và OnPause của lớp này. Và tất cả các hoạt động khác của Ứng dụng của tôi chỉ cần mở rộng lớp Siêu tùy chỉnh này thay vì Hoạt động. Điều này cũng mang lại cho tôi sự linh hoạt để thay đổi logic cơ bản bất cứ khi nào tôi nhận được giải pháp tốt nhất có thể.

+1

Kính gửi Downvoter xin vui lòng cung cấp một cách tốt hơn ... Tôi vẫn đang chờ câu trả lời tốt nhất ... – aProgrammer

Các vấn đề liên quan