显示PopupWindow所有窗口为目标的android 26
我想告诉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_TOAST
在sdk 26
弃用,他们建议使用TYPE_APPLICATION_OVERLAY
。然而,当我使用TYPE_APPLICATION_OVERLAY
,AndroidStudio
显示TYPE_APPLICATION_OVERLAY
所需的API 26.因此,TYPE_APPLICATION_OVERLAY
只有设备API 26很好地工作,为设备API < 26,它会崩溃(即使我已经启用Display/Draw over other app
许可)
有任何替代方法使TYPE_TOAST
与目标api 26
一起工作?任何帮助或建议将不胜感激。
由于:
- TYPE_APPLICATION_OVERLAY(在Api level 26介绍)是一个恒定值2038(0x000007f6)
- TYPE_TOAST(因为API级别1!)是一个恒定值2005(0x000007d5)
一个选项是check the System Version at Runtime,根据它的值使用正确的常量。
感谢您的答案,但是当我使用TYPE_TOAST与目标版本26时,带有API 25的设备将崩溃 –
@ PhanVanLinh为什么在运行时检测到目标版本是26时不使用TYPE_APPLICATION_OVERLAY? – VonC
对不起,我不太了解你的评论。如果我设置“目标版本是26”,那么'TYPE_APPLICATION_OVERLAY'只适用于设备API 26,对于设备API
我知道这不是一个标准的方式,但使用透明的活动来显示popupWindow可能会帮助你在这种情况下 – misagh