2017-10-20 81 views
6

我想告诉PopupWindow所有窗口之上(例如:其他popupwindow,对话,另一个活动屏幕)上面没有要求SYSTEM_ALERT_WINDOW所以我用WindowManager.LayoutParams.TYPE_TOAST显示PopupWindow所有窗口为目标的android 26

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

目前,如果我继续上面的代码和更新目标targetSdkVersion到26,然后它将与设备API崩溃25-26有例外android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?

我看到TYPE_TOASTsdk 26弃用,他们建议使用TYPE_APPLICATION_OVERLAY。然而,当我使用TYPE_APPLICATION_OVERLAYAndroidStudio显示TYPE_APPLICATION_OVERLAY所需的API 26.因此,TYPE_APPLICATION_OVERLAY只有设备API 26很好地工作,为设备API < 26,它会崩溃(即使我已经启用Display/Draw over other app许可) enter image description here

有任何替代方法使TYPE_TOAST与目标api 26一起工作?任何帮助或建议将不胜感激。

+0

我知道这不是一个标准的方式,但使用透明的活动来显示popupWindow可能会帮助你在这种情况下 – misagh

回答

0

由于:

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

+0

感谢您的答案,但是当我使用TYPE_TOAST与目标版本26时,带有API 25的设备将崩溃 –

+0

@ PhanVanLinh为什么在运行时检测到目标版本是26时不使用TYPE_APPLICATION_OVERLAY? – VonC

+0

对不起,我不太了解你的评论。如果我设置“目标版本是26”,那么'TYPE_APPLICATION_OVERLAY'只适用于设备API 26,对于设备API <26,它会崩溃。我在我的问题的最后过去提到过 –