最近使用 PupupWindow 遇到 unable to add window -- token null is not valid 的問題

有接裝置會遇到,有些則不會

Log as below

12-22 16:56:20.798: E/AndroidRuntime(1176): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
12-22 16:56:20.798: E/AndroidRuntime(1176): at android.view.ViewRootImpl.setView(ViewRootImpl.java:568)
12-22 16:56:20.798: E/AndroidRuntime(1176): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259)
12-22 16:56:20.798: E/AndroidRuntime(1176): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
12-22 16:56:20.798: E/AndroidRuntime(1176): at android.widget.PopupWindow.invokePopup(PopupWindow.java:1019)
12-22 16:56:20.798: E/AndroidRuntime(1176): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:850)
12-22 16:56:20.798: E/AndroidRuntime(1176): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:814)

原因是在調用以下此行程式碼時出現報錯

mPreviewWindow.showAtLocation(findViewById(R.id.gridView), Gravity.NO_GRAVITY, x, y);

 

上網查了一下原因,由於PupupWindow 需要依附一個Activity,而該 Activity 的 onCreate() 尚未執行完

 

因此最簡單的解法就是晚一點再彈出PupupWindow 

 

宣告一個 Handler:

326 private Handler MyPopupHandler = new Handler() {
327 @Override
328 public void handleMessage(Message msg) {
329 switch (msg.what) {
330 case 0:
331 int ScreenWidth = getApplicationContext().getResources().getDisplayMetrics().widthPixels;
332 int ScreenHeight = getApplicationContext().getResources().getDisplayMetrics().heightPixels;
333 int x = ScreenWidth/2 - mPreviewWindow.getPreviewViewWidth()/2;
334 int y = ScreenHeight/2 - mPreviewWindow.getPreviewViewHeight()/2;
335
336 mCurrentX = x;
337 mCurrentY = y;
338
339 mPreviewWindow.showAtLocation(findViewById(R.id.gridView), Gravity.NO_GRAVITY, x, y);
340 mPreviewWindow.update();
341
342 break;
343 }
344 }
345 };

 

在原先調用showAtLocation的地方改為

MyPopupHandler.sendEmptyMessageDelayed(0, 1000);

 

如此,再次擒猿成功,共勉之。

arrow
arrow
    全站熱搜

    擒猿小舖 發表在 痞客邦 留言(0) 人氣()