在Android 26上显示PopupWindow在所有窗口之上

7
我想显示一个PopupWindow在所有窗口之上(例如:另一个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:无法添加窗口--令牌android.view.ViewRootImpl $ W @ 859d91f无效;您的活动正在运行吗?

我看到sdk 26 已弃用TYPE_TOAST 并建议使用TYPE_APPLICATION_OVERLAY。然而,当我使用TYPE_APPLICATION_OVERLAY 时,AndroidStudio 显示需要API 26 。因此,TYPE_APPLICATION_OVERLAY 只能与设备api 26配合良好,在设备api < 26上,它将崩溃(即使我已启用显示/绘制其他应用程序权限)。 enter image description here

有没有其他方法可以使TYPE_TOAST 与目标api 26 一起使用?任何帮助或建议都将不胜感激。


我知道这不是标准的方法,但在这种情况下使用透明活动来显示弹出窗口可能会有所帮助。 - Misagh
2个回答

1
似乎API 25存在一个错误。如果您将目标API更改为26,则API 25设备将无法再使用TYPE_TOAST参数,即使它在API 25中是允许的。
唯一解决此问题的方法是要求用户在设置中为您的应用启用覆盖权限。然后,API 25和26的覆盖功能将按预期工作。

0

{btsdaf} - Linh
{btsdaf} - VonC
{btsdaf} - Linh
{btsdaf} - VonC
{btsdaf} - VonC
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接