दिलचस्प पोस्ट
NSNotificationCenter के साथ ऑब्जेक्ट कैसे पास करें I क्या वही सदिश से एक तत्व को पुश_बैक करना सुरक्षित है? क्या ओबजे-सी में स्विफ्ट एन्यूम का उपयोग करना संभव है? चेतावनी: mysql_fetch_array () पैरामीटर 1 को संसाधन होने की उम्मीद है, बुलियन में दिया गया है एक संकेतक "dereferencing" क्या मतलब है? वसंत में @Component, @Repository और @Service Annotations के बीच क्या अंतर है? कोणीय 2 अक्षम यूआरएल एन्कोडिंग 64 बिट ntohl () सी ++ में? jQuery .load () मेरी छवि पर काम नहीं कर रहा है एंड्रॉइड: मेरे एंड्रॉइड एप्लिकेशन में वीडियो कॉलिंग कैसे एकीकृत करें? सुरक्षित एसक्यूएल नामों का उपयोग कैसे करें? प्रतिबिंब के साथ आप कक्षा के सभी गुणों और उसके आधार वर्ग (पदानुक्रम ऊपर) कैसे प्राप्त कर सकते हैं? (सी#) गोलोंग गोरटिनेन्स में अलग तरह से बंद क्यों करता है? इकाई की रूपरेखा संस्थाओं का उपयोग व्यापारिक वस्तुओं के रूप में? Xcode में बहिष्कृत चेतावनियों को दबाना

एंड्रॉइड गतिविधि में एक पॉपअप विंडो बनाने में समस्याएं

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

सबसे पहले मुझे एक XML फ़ाइल है जो popup.xml नामक पॉपअप के लेआउट की घोषणा करती है (एक रैखिक लेआउट में एक पाठ दृश्य) और मैंने इसे अपने मुख्य गतिविधि के ओनक्रेट () में जोड़ा है:

PopupWindow pw = new PopupWindow(findViewById(R.id.popup), 100, 100, true); pw.showAtLocation(findViewById(R.id.main), Gravity.CENTER, 0, 0); 

दूसरा मैंने इस कोड के साथ सटीक वही किया:

 final LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); PopupWindow pw = new PopupWindow(inflater.inflate(R.layout.popup, (ViewGroup) findViewById(R.layout.main) ), 100, 100, true); pw.showAtLocation(findViewById(R.id.main_page_layout), Gravity.CENTER, 0, 0); 

सबसे पहले एक NullPointerException फेंकता है और दूसरा एक BadTokenException फेंकता है और कहते हैं "खिड़की जोड़ने में असमर्थ टोकन शून्य मान्य नहीं है"

क्या दुनिया में मैं गलत कर रहा हूं? मैं बेहद नौसिखिया हूं इसलिए कृपया मेरे साथ खड़े रहें।

Solutions Collecting From Web of "एंड्रॉइड गतिविधि में एक पॉपअप विंडो बनाने में समस्याएं"

BadTokenException से बचने के लिए, आपको सभी जीवनचक्र के तरीकों (-> गतिविधि विंडो प्रदर्शित होने के बाद) को तब तक पॉपअप दिखाने का स्थगित करना होगा:

  findViewById(R.id.main_page_layout).post(new Runnable() { public void run() { pw.showAtLocation(findViewById(R.id.main_page_layout), Gravity.CENTER, 0, 0); } }); 

यदि आप लगातार 2 गतिविधियों को लॉन्च करते हैं, तो कॉर्डिक द्वारा प्रदान किए गए समाधान काम नहीं करेंगे:

 startActivity(ActivityWithPopup.class); startActivity(ActivityThatShouldBeAboveTheActivivtyWithPopup.class); 

यदि आप इस तरह से एक मामले में पॉपअप को जोड़ते हैं, तो आपको एक ही क्रैश मिलेगा क्योंकि इस केस में ActivityWithPopup को विंडो में संलग्न नहीं किया जाएगा।

अधिक सार्वभौमिक समाधान अटैचमेंटटॉवंडो और ऑनडेकेटफ़ॉर्मवंडो पर है

और पोस्ट डेलायड (रननाबल, 100) के लिए भी कोई ज़रूरत नहीं है। क्योंकि यह 100 मिलियन कुछ भी गारंटी नहीं देता है

 @Override public void onAttachedToWindow() { super.onAttachedToWindow(); Log.d(TAG, "onAttachedToWindow"); showPopup(); } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); Log.d(TAG, "onDetachedFromWindow"); popup.dismiss(); } 

मैंने पाया कि स्वीकृत उत्तर मेरे लिए काम नहीं करता मुझे अभी भी खराब टोकन त्रुटि मिली है .. इसलिए मैंने केवल एक हैंडलर से रननबल को विलंब के साथ बुलाया।

 new Handler().postDelayed(new Runnable() { public void run() { showPopup(); } }, 100); 

इस अपवाद हो सकता है जब दो परिदृश्य हैं एक कार्डज़िक ने उल्लेख किया है अन्य परिदृश्य यहां वर्णित है: http://blackriver.to/2012/08/android-annoying-exception-unable-to-add-window-is-your-activity-running/

सुनिश्चित करें कि आप उन दोनों को संभाल लेंगे

समाधान नीचे दिए गए संवाद के लिए स्पिनर मोड को सेट करना है:

 android:spinnerMode="dialog" 

या

 Spinner(Context context, int mode) tnxs RamallahDroid 

यह देखो।

उपयोग के मामले पर निर्भर करते हुए, पॉप-अप के प्रकार के लिए संदेश प्रदर्शित करने के लिए, पॉपअप प्रकार को सेट करें setWindowLayoutType() का उपयोग करके setWindowLayoutType() को सेट करना, इस प्रकार की पॉप-अप अंतर्निहित गतिविधि पर निर्भर नहीं है।

संपादित करें: साइड इफेक्ट्स में से एक: एपीआई <= 18 के लिए पॉपअप विंडो में कोई इंटरैक्शन नहीं है, क्योंकि टच योग्य / फोकसनीय इवेंट सिस्टम द्वारा हटा दिए जाएंगे। ( http://www.jianshu.com/p/634cd056b90c )

मैं TYPE_PHONE का उपयोग करने के साथ समाप्त होता है (जैसा कि ऐप की अनुमति SYSTEM_ALERT_WINDOW होती है, अन्यथा यह भी काम नहीं करेगा)।

जांच लें कि findViewById कुछ देता है – लेआउट का निर्माण होने से पहले आप इसे बहुत जल्दी बुला रहे होंगे

इसके अलावा आप अपवादों के लिए लॉकैक आउटपुट पोस्ट करना चाह सकते हैं

आप इस चेक का उपयोग करने का भी प्रयास कर सकते हैं:

  public void showPopupProgress (){ new Handler().post(new Runnable() { @Override public void run() { if (getWindow().getDecorView().getWindowVisibility() == View.GONE) { showPopupProgress(); return; } popup.showAtLocation(.....); } }); } 

आप रूटव्यूज की जांच कर सकते हैं अगर इसकी टोकन है आप अपनी गतिविधि xml, mRootView से परिभाषित पैरेंट लेआउट प्राप्त कर सकते हैं

 if (mRootView != null && mRootView.getWindowToken() != null) { popupWindow.showAtLocation(); } 

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

 pop.showAtLocation(parentView, ... ); 

आप pw.showAtLocation विधि से स्टेटस बार के लिए y-offset खाते को निर्दिष्ट कर सकते हैं …