PopupWindow $ BadTokenException: विंडो जोड़ने में असमर्थ - टोकन नल मान्य नहीं है


80

पॉपअपविंडो दिखाते समय मेरे पास निम्न त्रुटि है। त्रुटियों को लाइन द्वारा ट्रिगर किया जाता है:

checkInPopup.showAtLocation((ViewGroup) mapView.getParent(), Gravity.CENTER_HORIZONTAL, 0, 0);

mapView एक MapView है और कुछ भी अशक्त नहीं है। स्टैकट्रेस:

01-08 18:00:09.402: E/AndroidRuntime(27768): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
01-08 18:00:09.402: E/AndroidRuntime(27768):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:513)
01-08 18:00:09.402: E/AndroidRuntime(27768):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301)
01-08 18:00:09.402: E/AndroidRuntime(27768):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
01-08 18:00:09.402: E/AndroidRuntime(27768):    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
01-08 18:00:09.402: E/AndroidRuntime(27768):    at android.view.Window$LocalWindowManager.addView(Window.java:537)
01-08 18:00:09.402: E/AndroidRuntime(27768):    at android.widget.PopupWindow.invokePopup(PopupWindow.java:988)
01-08 18:00:09.402: E/AndroidRuntime(27768):    at android.widget.PopupWindow.showAtLocation(PopupWindow.java:845)
01-08 18:00:09.402: E/AndroidRuntime(27768):    at android.widget.PopupWindow.showAtLocation(PopupWindow.java:809)
01-08 18:00:09.402: E/AndroidRuntime(27768):    at com.geoloc.ActivityCheckIn.onCreate(ActivityCheckIn.java:50)
01-08 18:00:09.402: E/AndroidRuntime(27768):    at android.app.Activity.performCreate(Activity.java:4465)
01-08 18:00:09.402: E/AndroidRuntime(27768):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)

यह मेरी गतिविधि का कोड है (जो MapActivity का विस्तार करता है)

    protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.checkin);
    mapView = (MapView) findViewById(R.id.mapview);

    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    checkInPopup = new PopupWindow(inflater.inflate(CHECK_IN_POPUP_LAYOUT, null, false));
    checkInPopup.setOutsideTouchable(true);
    checkInPopup.setHeight(100);
    checkInPopup.setWidth(200);
    checkInPopup.showAtLocation((ViewGroup) mapView.getParent(), Gravity.CENTER_HORIZONTAL, 0, 0);
}

अपने विचारों को बांटने के लिए धन्यवाद

जवाबों:


71

आप अपना पॉपअप बहुत जल्दी दिखा रहे हैं। आप Onresume में दिखावट के लिए विलंबित रन पोस्ट कर सकते हैं, इसे आज़माएं

संपादित करें: इस पोस्ट में एंड्रॉइड गतिविधि में एक पॉपअप विंडो बनाने में समस्याओं का जवाब दिया गया है


मैं अपवाद को पकड़ने का सुझाव दूंगा और काफी विलंब (कम से कम कुछ समय के लिए) के साथ फिर से पोस्ट करता रहूंगा, क्योंकि शुरुआती देरी का अनुमान नहीं लगाया जा सकता है।
— हर्ष

93

मेरे साथ एक ही समस्या तब हुई जब मैं गतिविधि में पॉपअप मेनू दिखाने की कोशिश करता हूं, मुझे भी समान छूट मिली है, लेकिन मैं समस्या का समाधान करके समस्या का समाधान कर रहा हूं

YourActivityName.this के बजाय getApplicationContext()पर

Dialog dialog = new Dialog(getApplicationContext());

और हाँ यह मेरे लिए काम करता है यह किसी और की मदद करेगा


इससे मुझे अच्छी मदद मिली। अच्छा जवाब thanx
— थारुशा


10

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

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


7
ध्यान दें कि लिंक-केवल उत्तर हतोत्साहित किए जाते हैं, संदर्भ समय के साथ बासी हो जाते हैं। लिंक को संदर्भ के रूप में रखते हुए कृपया यहां एक स्टैंड-अलोन सिनोप्सिस जोड़ने पर विचार करें।
— क्लियोपेट्रा

@ TheMan नीस ~ इतना छोटा शक्तिशाली टिप! धन्यवाद!
— सेमीक्रोमेंस

5
  @Override
protected void onCreate(Bundle savedInstanceState) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.popup_window_layout, new LinearLayout(mContext), true);
    popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    popupWindow.setContentView(view);
}

   @Override
public void onWindowFocusChanged(boolean hasFocus) {
    if (hasFocus) {
        popupWindow.showAtLocation(parentView, Gravity.BOTTOM, 0, 0);
    }
}

सही तरीका है onWindowFocusChanged () पर popupwindow.show ()।


यह मूल प्रश्न की समस्या को हल करता है और सबसे अच्छा / साफ समाधान है।
— डेल

3

एक पॉपअप का जनक खुद पॉपअप नहीं हो सकता। उनके माता-पिता दोनों को समान होना चाहिए। इसलिए, यदि आप एक पॉपअप के अंदर एक पॉपअप बनाते हैं, तो आपको माता-पिता के पॉपअप को सहेजना होगा और इसे माता-पिता बनाना होगा।

यहाँ एक उदाहरण है


1

नीचे की तरह पॉप दिखाने की कोशिश करें

findViewById(R.id.main_layout).post(new Runnable() {
        public void run() {
            mPopupWindow.showAtLocation(findViewById(R.id.main_layout), Gravity.CENTER, 0, 0);
            Button close = (Button) customView.findViewById(R.id.btn_ok);
            close.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mPopupWindow.dismiss();
                    doOtherStuff();
                }
            });
        }
    });

1

दिखाने से पहले इस विधि का उपयोग करें

public static ViewGroup getActivityFirstLayout(Context ctx)
{
    return (ViewGroup)((ViewGroup) ActivityMaster.getActivity(ctx).findViewById(android.R.id.content)).getChildAt(0);
}

private boolean activityIsOk(Activity activity)
{
    boolean s1 = !(activity == null || activity.isFinishing());

    if(s1)
    {
        View v = LayoutMaster.getActivityFirstLayout(activity);
        return v.isShown() && ViewCompat.isLaidOut(v);
    }

    return false;
}

0

इसका उपयोग करने का प्रयास करें

LayoutInflater inflater = (LayoutInflater).getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflate.from(YourActivity.this).inflate(R.layout.yourLayout, null);

क्या आप यह सुनिश्चित करने के लिए पूर्ण कोड भी पोस्ट कर सकते हैं कि वह सही सामान की जगह ले रहा है। धन्यवाद।
— kwoxer

0

खोज और परीक्षण के कई घंटों के बाद मैंने निम्नलिखित समाधान (विभिन्न एसओ समाधानों को लागू करके) पाया, यहां यह किसी भी मामले में विफल नहीं हुआ जो मैं दुर्घटनाग्रस्त हो रहा था।

     Runnable runnable = new Runnable() {
            @Override
            public void run() {

          //displayPopup,progress dialog or what ever action. example

                ProgressDialogBox.setProgressBar(Constants.LOADING,youractivityName.this);
            }};

जहां logcat इंगित कर रहा है कि दुर्घटना हो रही है .. प्रसारण शुरू करें। प्रसारण मिलने पर मेरा मामला।

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if(!isFinishing()) {
                    new Handler().postAtTime(runnable,2000);
                }
            }
        });

-1

पॉपअप को इस तरह दिखाने की कोशिश करें

new Handler().postDelayed(new Runnable(){

    public void run() {
       popupWindow.showAtLocation(context.getWindow().getDecorView(), Gravity.CENTER,0,0);
    }

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