关于PopupWindow的BadTokenException及IllegalStateException

关于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种看大家喜欢吧。微笑

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值