在目标android 26的所有窗口上方显示PopupWindow

时间:2017-10-20 07:50:12

标签: android popupwindow android-8.0-oreo

我想在所有窗口上方显示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权限) enter image description here

是否有其他方法可以让TYPE_TOAST与目标api 26一起使用?任何帮助或建议将非常感谢。

2 个答案:

答案 0 :(得分:0)

自:

一个选项是check the System Version at Runtime,并且根据其值,使用正确的常量。

答案 1 :(得分:0)

API 25似乎存在错误。该错误是,如果您将目标API更改为26,则API 25设备将无法再使用TYPE_TOAST参数,即使它在API 25中是允许的。

解决此问题的唯一方法是让用户在您的应用的“设置”中启用叠加权限。然后,API 25和26叠加将按预期运行。