我想在所有窗口上方显示PopupWindow
(例如:另一个弹出窗口,对话框,另一个活动屏幕)而没有请求SYSTEM_ALERT_WINDOW
所以我使用WindowManager.LayoutParams.TYPE_TOAST
public void showSimplePopupWindow() {
final View popupView = layoutInflater.inflate(R.layout.popup_layout_2, null);
final PopupWindow popupWindow = new PopupWindow(popupView);
...config popup window...
PopupWindowCompat.setWindowLayoutType(popupWindow, WindowManager.LayoutParams.TYPE_TOAST);
popupWindow.showAsDropDown(findViewById(R.id.button_show_popup_window));
}
如果我设置targetSdkVersion < 26
,它在所有Android版中运行良好。
目前,如果我保留上面的代码并将目标targetSdkVersion
更新为26,那么它将会因设备api 25-26 而崩溃而异常android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@859d91f is not valid; is your activity running?
我发现TYPE_TOAST
已弃用sdk 26
,他们建议使用TYPE_APPLICATION_OVERLAY
。但是,当我使用TYPE_APPLICATION_OVERLAY
时,AndroidStudio
显示TYPE_APPLICATION_OVERLAY
所需的api 26.因此,TYPE_APPLICATION_OVERLAY
仅适用于设备api 26,对于设备api&lt; 26,它会崩溃(即使我已启用Display/Draw over other app
权限)
是否有其他方法可以让TYPE_TOAST
与目标api 26
一起使用?任何帮助或建议将非常感谢。
答案 0 :(得分:0)
自:
一个选项是check the System Version at Runtime,并且根据其值,使用正确的常量。
答案 1 :(得分:0)
API 25似乎存在错误。该错误是,如果您将目标API更改为26,则API 25设备将无法再使用TYPE_TOAST参数,即使它在API 25中是允许的。
解决此问题的唯一方法是让用户在您的应用的“设置”中启用叠加权限。然后,API 25和26叠加将按预期运行。