关于PopupWindow的弹窗,若在Activity的onCreate方法或Fragment的onActivityCreated方法里立即调用show PopWindow方法时会出现一个异常:
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
解决方案:
1.做延迟处理,但感觉这个延迟时间不太好给,对差一点的手机可能需要1秒,代码: popupHandler.sendEmptyMessageDelayed(SHOW_POP, 1000L);
2.还有一种在stackoverflow找的一种解决方式感觉更好,就是找一个控件,然后在post里执行show PopWindow的操作,伪代码如下:
findViewById(R.id.rootView).post(new Runnable() { public void run() { //在此线程里进行即可,也可以利用handler发送到主线程执行这段代码 popWindow.showAtLocation(findViewById(R.id.anchorView), Gravity.CENTER, 0, 0); } });
3.把show PopWindow那段出错的代码try住,但这样在调用PopWindow.dismiss方法时就可能出现IllegalStateException:ViewAncestor is attached to null
具体错误信息为:
java.lang.IllegalStateException: Calling with view android.widget.PopupWindow$PopupViewContainer@4158b140 but the ViewAncestor is attached to null
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:478)
at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:163)
at android.widget.PopupWindow.dismiss(PopupWindow.java:1256)
at com.***.***.fragment.MainFragment.showGuidePop(MainFragment.java:396)
at com.***.***.fragment.MainFragment.setGuideNext(MainFragment.java:483)
at com.***.***.fragment.MainFragment.access$1700(MainFragment.java:106)
at com.***.***.fragment.MainFragment$3.onClick(MainFragment.java:376)
at android.view.View.performClick(View.java:3538)
at android.view.View$PerformClick.run(View.java:14319)
at android.os.Handler.handleCallback(Handler.java:608)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:5099)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:991)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758)
at dalvik.system.NativeStart.main(NativeStart.java)
这种错误经我测试跟设备有关,在4.0(SDK->14)设备出现了这种情况,而其之上的4.2-7设备好像没有这种情况,只是PopWindow没有弹出而已,
所以应该避免第3种方案,第1种或第2种看大家喜欢吧。