Android 'विंडो जोड़ने में असमर्थ - टोकन नल अनुप्रयोग के अपवाद के लिए नहीं है


134

जब मैं एक संवाद खोलने की कोशिश करता हूं तो मुझे निम्नलिखित एंड्रॉइड अपवाद मिलते हैं। क्या कोई मुझे यह समझने में मदद कर सकता है कि क्या चल रहा है और मैं इस समस्या को कैसे ठीक कर सकता हूं?

android.view.WindowManager$BadTokenException: 
  Unable to add window -- token null is not for an application
    at android.view.ViewRoot.setView(ViewRoot.java:509)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.app.Dialog.show(Dialog.java:241)

8
हमें कुछ कोड पोस्ट किए बिना कैसे पता चलेगा?
फालमरी


1
कृपया इस उत्तर को देखें, इस उत्तर के लिंक को पोस्ट करने की मुख्य बात यह है कि इस उत्तर पर टिप्पणियों में अच्छी बातचीत हुई है, जिसमें बताया गया है कि यह समस्या क्यों आ रही है और इससे निपटने का सबसे अच्छा तरीका क्या है http://stackoverflow.com/a/ २२
२४

यदि आप सेवा का उपयोग करते हैं, तो stackoverflow.com/questions/23516689/… पढ़ें ।
कूलमैन्ड

जवाबों:


421

मैं अनुमान लगा रहा हूं - क्या आप एक एप्लिकेशन संदर्भ के साथ डायलॉग बनाने की कोशिश कर रहे हैं? कुछ इस तरह:

new Dialog(getApplicationContext());

ये गलत है। आपको एक गतिविधि संदर्भ का उपयोग करने की आवश्यकता है।

आपको इस तरह की कोशिश करनी होगी:

new Dialog(YourActivity.this);

1
धन्यवाद। लेकिन मैंने नए डायलॉग (getApplicationContext ()) का उपयोग नहीं किया; मैं केवल 'नए AlertDialog.Builder (mContext) का उपयोग करता हूं;' जहां mContext किसी गतिविधि का एक संदर्भ है।
माइकल

10
तब mContext MyActivity.this होना चाहिए।
लुइस

10
कस्टम संवाद बनाने के लिए Android डॉक्स ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) में यह त्रुटि है। प्रसंग mContext = getApplicationContext (); संवाद संवाद = नया संवाद (mContext); आपका फिक्स डायलॉग डायलॉग = नया डायलॉग (यह) होता है; जो काम करता है! धन्यवाद
bnieland

1
डेवलपर .android.com/guide/topics/ui/dialogs.html तय किया गया है (थोड़ी देर से)। केवल संदर्भ के लिए इसे इंगित करना। पैटर्न में भी सुधार किया गया है। :)
मार्टिन मार्कोसिनी

2
getActivity()@ सागरदुर्गा का प्रयोग करें
प्रतीक बुटानी

34

आप उपयोग करना जारी रख सकते हैं getApplicationContext(), लेकिन उपयोग करने से पहले, आपको इस ध्वज को जोड़ना चाहिए: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)और त्रुटि नहीं दिखाई देगी।

और अनुमति जोड़ना न भूलें:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

हां, यह काफी सरल है। और अनुमति जोड़ना न भूलें, मैंने अभी-अभी संपादन किया है।
कोडजक्स

3
एक पुनर्नवीनीकरण अनुकूलक में getActivity () का उपयोग नहीं कर सकते हैं
मार्टिन एरिक

यह कमाल है :)
सैयद हमजा हसन

आप ध्वज को कैसे जोड़ते हैं?
कोनर डेसेन

13

मेरे मामले में मैं इस तरह अपना संवाद बनाने की कोशिश कर रहा था:

new Dialog(getApplicationContext());

इसलिए मुझे इसके लिए बदलना पड़ा:

new Dialog(this);

और यह मेरे लिए ठीक काम करता है;)


1
आपका उत्तर सही है, हालांकि यह तभी काम करेगा जब आप गतिविधि के दायरे में होंगे। यदि आप एक आंतरिक दायरे में हैं, तो आपको MyActivity.classइसके बजाय उपयोग करना होगा thisक्योंकि thisएक अलग ऑब्जेक्ट को संदर्भित करता है।
शौहर

1
इसके अलावा, thisसुनिश्चित करें कि Dialogआपके विषय को अपनी विरासत मिलेगी ।
TheRealChx101

12

आशा है कि यह काम करेगा getParent()की contextतरह तर्क जगह पर कोशिश करो new AlertDialog.Builder(getParent());, यह मेरे लिए काम किया।


क्यों GetParent () का उपयोग करें ?, क्या मतलब है?
जोस कास्त्रो

2
जब आप किसी अन्य वर्ग में कोई संवाद दिखा रहे हैं जो गतिविधि वर्ग का विस्तार नहीं करता है, तो हो सकता है कि आपको उस वर्ग का संदर्भ न मिले जो गतिविधि का विस्तार कर रहा है। इसलिए अपने वर्ग के अंदर के संदर्भ को प्राप्त करने के लिए जहां आप संवाद दिखाने की कोशिश कर रहे हैं लेकिन उस गतिविधि का विस्तार नहीं कर रहे हैं जिसे आप getParent () का उपयोग कर सकते हैं जो आपको उस श्रेष्ठ गतिविधि का संदर्भ देता है।
प्रियांक जोशी

1
धन्यवाद @PriyankJoshi, आपने मेरा दिन बचाया, यह "एंड्रॉइड यूनेबल जोड़ने में मान्य नहीं है, क्या आपकी गतिविधि चल रही है?" के अजीब अपवाद को हल करती है।
असलम युसेफ मोहम्मद

मैं getParent () का उपयोग कैसे कर सकता हूं?
विनिडॉग

धन्यवाद! इसने मेरे मामले में काम किया। मैं बुला रहा था this.parent.getActivity().getApplicationContext()लेकिन this.parent.getActivity()चाल चली।
carlodonz

3

मैं अनुमान लगा रहा हूं - क्या आप डायलॉग का उपयोग करने की कोशिश कर रहे हैं।

 getApplicationContext()
 mContext which is passed by activity.

यदि आप डायलॉग को नॉन एक्टिविटी क्लास में प्रदर्शित करते हैं तो आपको एक्टिविटी को एक पैरामीटर के रूप में पास करना होगा।

Activity activity=YourActivity.this;

अब यह बहुत अच्छा होगा।

अगर आपको कोई परेशानी हो तो मुझे बताएं।


2

मैंने संदर्भ क्षेत्र में इसके साथ प्रयास किया:

this.getActivity().getParent()

और यह मेरे लिए ठीक काम करता है। यह एक ऐसे वर्ग से था जो "फ्रैगमेंट" से निकला है:

public class filtro extends Fragment{...

2

नमस्ते अगर आप एडेप्टर का उपयोग कर रहे हैं तो एक मौका हो सकता है।
जब आपको एडॉप्टर में किसी भी संवाद का उपयोग करने की आवश्यकता होती है, तो कुछ समय में काम नहीं करेगा।

यहाँ वह तरकीब है जिसका उपयोग मैंने किया है v.getRootView().getContext() जहाँ v दृश्य वस्तु है जिसे आप संदर्भित कर रहे हैं।
उदाहरण के लिए।


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new DatePickerDialog(v.getRootView().getContext(), date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });  
If you are getting this problem because of alert dialog.
Refer [here][1] But it is same concept.


  [1]: https://stackoverflow.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class

धन्यवाद ! अपना कीमती समय बचाने के लिए !! (^_^)
अच्छा उमंग

1

मुझे एक ही अपवाद मिला। मैं इसे ठीक करने के लिए फ़ंक्शन में पैरामीटर के रूप में डायलॉग के उदाहरण को पारित करने और केवल संदर्भ के बजाय पास का उपयोग करने के लिए इसका उपयोग करता हूं, फिर getContext () का उपयोग करके। यह समाधान मेरी समस्या को हल करता है, आशा है कि यह मदद कर सकता है


0

मुझे यह अपवाद मिला, जब मैंने नीचे दो मामलों का उपयोग करके कॉर्डोवा प्लगिन के तहत प्रगति डायलॉग खोलने की कोशिश की,

  1. न्यू प्रोग्रेसडायलॉग (this.cordova.getActivity ()। getParent ());

  2. न्यू प्रोग्रेसडायलॉग (this.cordova.getActivity ()। getApplicationContext ());

बाद में इस तरह बदल गया,

न्यू प्रोग्रेसडायलॉग (this.cordova.getActivity ());

इसका काम करना मेरे लिए ठीक है।


0

यह प्रयोग करें और संदर्भ मेरे लिए काम नहीं किया..लेकिन MyActivityName.this ने काम किया। आशा है कि यह किसी को भी, जो इसकी जरूरत है मदद करता है


0

मैंने AndroidManifest.xml में उपयोगकर्ता-अनुमति नीचे जोड़कर इस त्रुटि को हल किया

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

इसके अलावा, गतिविधि के नाम के साथ अलर्ट संवाद आरंभ करें:

AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);

अधिक जानकारी के लिए, ==> Android में अलर्ट डायलॉग कैसे बनाएं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.