报错如下:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gxuwz.yixin, PID: 29723
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gxuwz.yixin/com.gxuwz.yixin.activity.edit.EditAddressActivity}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3315)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3464)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2051)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:239)
at android.app.ActivityThread.main(ActivityThread.java:7604)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:953)
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:989)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:387)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:97)
at android.widget.PopupWindow.originalInvokePopup(PopupWindow.java:1590)
at android.widget.PopupWindow.invokePopup(PopupWindow.java:1575)
at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1345)
at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1311)
at com.gxuwz.yixin.activity.edit.EditAddressActivity.onCreate(EditAddressActivity.java:46)
at android.app.Activity.performCreate(Activity.java:7916)
at android.app.Activity.performCreate(Activity.java:7903)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3290)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3464)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2051)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:239)
at android.app.ActivityThread.main(ActivityThread.java:7604)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:953)
主要就这句:Unable to add window -- token null is not valid; is your activity running?
最终的意思就是,你的 Activity 视图还没有加载完,你就要在此 Activity 上添加对话框是不可以的 因为每一个对话框都要依附于一个 Activity,所以我们要用到一个判断 Activity 加载完的方法,在 Activity 加载完毕之后调用对话框即可
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
if (hasFocus) {
// 调用对话框部分
}
}
但是有的小伙伴会发现,这个对话框会一直跳出,点了关闭又跳出,重复执行,所以我加了个计数器来判断。
int count = 0;
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
if (hasFocus && count == 0) {
count++;
// 调用对话框部分
}
}
这样一来,只有第一次进入的时候会显示对话框,其余的时候都不会弹出了