2013-07-18 34 views
1

我在我的Android應用程序中有一個微調,我可以讓它顯示,但秒。我點擊它,應用程序崩潰並拋出:不能在Android應用程序中使用微調器

無法添加窗口 - 標記android.view.ViewRootImpl $ Wfb @無效:您的活動正在運行嗎?

佈局很簡單。我有一個活動,有一個列表和一個按鈕來添加一些東西到列表中。點擊後,添加按鈕打開一個彈出窗口,顯示微調框,文本框和按鈕。一切正常,直到我點擊微調。現在

我搜索谷歌一小時,發現這些:

Android - Dynamically Adding values to Spinners

BadTokenException Unable to add Window Spinner in PopUpWindow

Android Spinner Error : android.view.WindowManager$BadTokenException: Unable to add window

多。他們似乎都指向上下文,但是我已經嘗試了使用「this」,getApplicationContext,到我的activity.context的名稱,並且它們都不起作用。我嘗試使用某人提供兩次的答案,而不是僅僅將contentView設置爲頁面,這使情況變得更糟(應用程序立即與空指針異常一起崩潰)。

下面是彈出窗口(點擊「添加」按鈕時執行)代碼:

public void add_itinerary_clicked(View view) 
{ 
    LayoutInflater i = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE); 
    View popupView = i.inflate(R.layout.itinerary_add_item_page, null); 
    popup = new PopupWindow(popupView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    popup.showAtLocation(popupView , Gravity.CENTER, 0, 0); 
    Spinner airlineChoice = (Spinner) popupView.findViewById(R.id.airlineSpinner); 
    Button addBtn= (Button) popupView.findViewById(R.id.finish_addItinerary); 

    String[] list = new String[1]; 
    list = airlineMap.keySet().toArray(list); 

    ArrayAdapter<CharSequence> spinnerAdapter = new ArrayAdapter<CharSequence>(getApplicationContext(), android.R.layout.simple_spinner_item, list); 
    spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item); 
    airlineChoice.setAdapter(spinnerAdapter); 


    addBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      finish_addItinerary_clicked(); 
      popup.dismiss(); 
     } 
    }); 
} 

我在在這一點上完全失去我。如果它不是上下文(我試過別人說過的話)那麼它是什麼?

以下是完整的錯誤消息:

FATAL EXCEPTION: main 
android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:567) 
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
    at android.widget.PopupWindow.invokePopup(PopupWindow.java:993) 
    at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:899) 
    at android.widget.ListPopupWindow.show(ListPopupWindow.java:603) 
    at android.widget.Spinner$DropdownPopup.show(Spinner.java:981) 
    at android.widget.Spinner.performClick(Spinner.java:609) 
    at android.view.View$PerformClick.run(View.java:17355) 
    at android.os.Handler.handleCallback(Handler.java:725) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5041) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

這是您的代碼中的錯字? 'lsit = airlineMap.keySet()。toArray(list);' –

+0

你可以發佈拋出的異常嗎? – Rizowski

+1

對不起,沒有錯字已更新的問題,而不是我的實際代碼。現在的問題正確地反映了我的代碼中的內容。 –

回答

2
  1. 我認爲你不應該使用應用程序上下文,而是使用活動上下文。
  2. 使用對話框而不是彈出窗口。根據谷歌的說法,它更簡單,維護代碼更少,並且符合標準。
  3. 我認爲需要在微調器上有某種點擊監聽器。
+0

1.沒有我已經使用過的上下文(this.activity.this,getBaseContext等等) 2.我會嘗試一下現在 3.我添加了一個偵聽器,但是這並沒有改變錯誤。 :( 雖然感謝。 –

+0

這工作!也就是說,對話框工作。但我不知道爲什麼。 –

+0

我的正確答案是否正確! RAWR! – Buggie

0

有一件事你可以嘗試用你的活動範圍內,而不是你的應用程序/基本上下文。這可能有助於這種情況。

1

感謝Buggie,我找到了解決辦法。我正在使用對話框。它的工作原理並不會拋出錯誤。我不知道爲什麼這個工程和一個彈出式窗口不,但這裏是我的代碼的作品:

public void add_itinerary_clicked(View view) 
{ 
    dialog = new Dialog(this); 
    dialog.setContentView(R.layout.itinerary_add_item_page); 

    Spinner airlineChoice = (Spinner) dialog.findViewById(R.id.airlineSpinner); 
    Button addBtn= (Button) dialog.findViewById(R.id.finish_addItinerary); 

    String[] list = new String[1]; 
    list = airlineMap.keySet().toArray(list); 

    ArrayAdapter<CharSequence> spinnerAdapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, list); 
    spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item); 
    airlineChoice.setAdapter(spinnerAdapter); 
    airlineChoice.setOnItemSelectedListener(this); 

    addBtn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish_addItinerary_clicked(); 
      dialog.dismiss(); 
     } 
    }); 

    dialog.show(); 
} 
相關問題