2012-06-12 18 views
5

मेरी समस्या this 2 year old question के समान है, मैं अपडेट किए गए उत्तरों को प्राप्त करने के लिए एक ही समस्या पोस्ट कर रहा हूं, क्योंकि दो वर्षों में बहुत कुछ बदल गया है।एंड्रॉइड पर वर्तमान में दृश्यमान गतिविधि पर मैं एक संवाद कैसे प्रदर्शित कर सकता हूं?

मैं जिंजरब्रेड + उपकरणों के लिए एक ऐप के लिए विकास कर रहा हूं, मेरे पास कई गतिविधियां हैं और पृष्ठभूमि में मुझे सर्वर से कुछ डेटा प्राप्त होता है। अब कुछ मामलों में उस डेटा के आधार पर मुझे उपयोगकर्ता को Dialog दिखाने की आवश्यकता है। समस्या यह है कि मैं कैसे जानता हूं कि वर्तमान मोर्चा सबसे अधिक गतिविधि कौन सा है?

मैं क्या करने की कोशिश की, मैं getApplicationContext() जबकि Dialog निर्माण देने की कोशिश की है, फिर भी जो काम नहीं कर रहा है। कुछ अपवाद फेंकना।

एक समाधान? (मुझे वास्तव में इससे नफरत है), एक समाधान Application कक्षा में एक चर द्वारा वर्तमान में दृश्यमान गतिविधि का ट्रैक रखने के लिए किया जा सकता है, और इसे प्रत्येक गतिविधि के onResume() पर सेट कर सकता है। मैं वास्तव में नहीं है, तो अपने इस लक्ष्य को हासिल करने के लिए होशियार तरीके हैं और मुझे यकीन है कि उनके इस लक्ष्य को हासिल करने के लिए होशियार तरीके हैं रहा हूँ इस बही खाता ऐसा करने के लिए,

मेरे सरल सवाल है,
मैं पर एक संवाद कैसे प्रदर्शित कर सकते हैं चाहता हूँ वर्तमान में दृश्य गतिविधि?, ताकि मैं AlertDialog.builder के लिए यह संदर्भ दे सकूं, जो मुझे लगता है कि मेरा काम करेगा .. यदि से अधिक नहीं है तो मैं शीर्ष गतिविधि पर एक संवाद कैसे प्रदर्शित कर सकता हूं?

संपादित करें, मैं निम्नलिखित कोड निजी View.OnClickListener cancelClickListener का उपयोग कर एक सरल संवाद बनाने = नए 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"); 
    } 
}; 

अपवाद AlertDialog.Builder alertDialogBuilder = नए AlertDialog.Builder का उपयोग कर ( getAplicationContext()); मुझे अपवाद निम्न देता है,

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

getAplicationContext() के साथ आप क्या अपवाद प्राप्त कर रहे हैं? –

+0

कृपया कुछ कोड दिखाएं। आपने अभी तक क्या किया है? – Dhruvisha

+0

ठीक है, आप एक अतिरिक्त गतिविधि ला सकते हैं जो पारदर्शी है और उस गतिविधि पर संवाद दिखा सकता है। गतिविधि में संवाद के लिए सभी कोड लिखें और जब भी आपको संवाद दिखाना होगा, तो गतिविधि को सामने लाएं। – Rasel

उत्तर

5

अगर यह आपकी मदद करता है इस प्रयास करें:

1. एक Activitytransparent theme and no title साथ बनाएँ।

2.onCreate() में alert dialog परिभाषित करें।

3. प्रसारण से इस गतिविधि को शुरू करना रिसीवर alert dialog दिखाएगा।

2

, बस आप एक Activity बना सकते हैं और manifest इस तरह में Dialog करने के लिए अपने विषय निर्धारित कर सकते हैं:

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

भी singleInstance को launchMode सेट गतिविधि के कई उदाहरण को रोकने के लिए। अपने संवाद के लिए जो भी लेआउट आप उपयोग करना चाहते हैं उसका उपयोग करें।

विभिन्न संदेशों को सेट करने के लिए, अतिरिक्त स्ट्रिंग संदेश डालें और उन्हें आप पर संवाद करें (गतिविधि) शुरू करें।

+0

अच्छा लगता है .. लेकिन क्या यह हमेशा वर्तमान में दिखाई देने वाली गतिविधि पर प्रदर्शित होगा ... – aProgrammer

+0

हां यह वर्तमान में दृश्यमान गतिविधि पर दिखाएगा। –

1

मैं

private Activity currentOnTopActivity; 
मेरी आवेदन कक्षा में

होने से इस समस्या का समाधान, मैं सेट/onResume() और प्रत्येक गतिविधि की onPause() अंदर इस चर रीसेट करें।

किया, जब भी मैं उपयोगकर्ता के लिए एक संवाद दिखाना चाहते हैं, मैं सिर्फ निम्नलिखित है ...

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

        } 

       }); 
      } 

संपादित प्रक्रिया मैं एक अमूर्त वर्ग MyActivity जो गतिविधि फैली बनाया आसान बनाने के लिए और सेटर कॉल को इस कक्षा के ऑनर्यूम और ऑन पॉज़ में रखा गया है। और मेरे आवेदन की सभी अन्य गतिविधियां गतिविधि के बजाए इस कस्टम सुपर क्लास को बस बढ़ाती हैं। जब भी मुझे सबसे अच्छा संभव समाधान मिलता है तो यह मुझे अंतर्निहित तर्क को बदलने की लचीलापन भी देता है।

+1

प्रिय डाउनवॉटर कृपया एक बेहतर तरीका प्रदान करें ... मैं अभी भी सबसे अच्छे जवाब की प्रतीक्षा कर रहा हूं ... – aProgrammer

संबंधित मुद्दे

 संबंधित मुद्दे