android - PopUpWindow WindowManager$BadTokenException: 无法添加窗口 - 令牌 null 无效
问题描述
我开始了一个有许多 UI 的项目。这导致有一个教程屏幕。因此,我为第一次使用构建了一个 popUpwindow。但是我在使用 popupWindow 时遇到了一些麻烦。我添加了以下代码来创建它:
SharedPreferences sharedPreference14 = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
boolean isFirstLaunched = sharedPreference14.getBoolean("IS_FIRTS_LAUNCHER",false);
if (isFirstLaunched==false){
LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custompopup,null);
float density=MainActivity.this.getResources().getDisplayMetrics().density;
final PopupWindow pw = new PopupWindow(layout, (int)density*285, (int)density*285, true);
pw.showAtLocation(layout, Gravity.CENTER, 0, 0);
Button btnNext =(Button) layout.findViewById(R.id.btnNext);
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pw.dismiss();
}
});
}
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("IS_FIRTS_LAUNCHER",true);
editor.commit();
但是,应用程序崩溃了。日志猫:
ejava.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.manh_dev.darkygenbmi/com.example.manh_dev.darkygenbmi.MainActivity}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
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:585)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
at android.view.Window$LocalWindowManager.addView(Window.java:547)
at android.widget.PopupWindow.invokePopup(PopupWindow.java:988)
at android.widget.PopupWindow.showAtLocation(PopupWindow.java:845)
at android.widget.PopupWindow.showAtLocation(PopupWindow.java:809)
at com.example.manh_dev.darkygenbmi.MainActivity.onCreate(MainActivity.java:211)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
出了什么问题以及如何解决?(popupWindow 听起来像是第一次使用的教程!)。这是我的 .xml 文件(custompopup.xml)的一部分:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout android:layout_width="250dp"
android:layout_height="250dp"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_gravity="center"
android:background="@color/colorPrimaryDark"
android:id="@+id/poup"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom"
android:layout_marginRight="6dp"
android:text="Next"
android:layout_marginBottom="7dp"
android:id="@+id/btnNext"
/>
解决方案
您过早显示弹出窗口,您需要推迟它,直到所有生命周期方法完成,添加延迟以避免BadTokenException
.
试试这个(这不是最好的解决方案):
new Handler().postDelayed(new Runnable() {
public void run() {
pw.showAtLocation(layout, Gravity.CENTER, 0, 0);
}
}, 100);
推荐阅读
- raspberry-pi - 尝试在 QEMU 下运行 Raspberry-Pi 映像,但 VM 内存限制为 256MB
- ios - SwiftUI 中的左右填充(不是前导和尾随)
- python - 我尝试在 django 中构建的测验 - 如何使其工作?
- java - 如何在以正确方式获取的事务之外初始化延迟加载的集合?
- flutter - 颤抖)我想知道如何从图库中获取图片
- javascript - oauth2 重定向在 openapi3.0/swagger UI 中失败
- r - 如何转置单列以适应 R 中时间序列中的其余数据?
- javascript - 尝试将 Enum[ ] 从儿子传递给父亲组件
- java - 多对多按添加到帖子的时间排序
- javascript - 在 JavaScript Azure Functions 中未定义 process.env 中的用户定义键