我使用 PopupWindow 玩菜单,它与 EditText 重叠。
它工作正常,除了我的 PopupWindow 与来自 EditText IME 系统的某些项目(选择标记、粘贴按钮)重叠。
我的问题是:如何强制对 PopupWindow 进行 z 排序,使其显示在这些装饰上方?
这是正在发生的事情的图像。我需要将我的 PopupWindow(菜单)绘制在所有内容之上,从而以某种方式告诉 WindowManager 如何订购窗口。谢谢。
我使用 PopupWindow 玩菜单,它与 EditText 重叠。
它工作正常,除了我的 PopupWindow 与来自 EditText IME 系统的某些项目(选择标记、粘贴按钮)重叠。
我的问题是:如何强制对 PopupWindow 进行 z 排序,使其显示在这些装饰上方?
这是正在发生的事情的图像。我需要将我的 PopupWindow(菜单)绘制在所有内容之上,从而以某种方式告诉 WindowManager 如何订购窗口。谢谢。
我自己找到了答案。
这些装饰是普通的 PopupWindow-s,由 EditText 管理。
WindowManager.LayoutParams.type定义了任何 Window 的 Z 顺序,实际上它定义了 Window 的用途。弹出窗口的有效范围是 FIRST_SUB_WINDOW - LAST_SUB_WINDOW。
应用程序通常不能更改PopupWindow的“类型” ,除了使用 Java 反射调用隐藏函数 PopupWindow.setWindowLayoutType(int) 并设置所需的窗口类型。
结果:
编辑: 这样做的代码:
Method[] methods = PopupWindow.class.getMethods();
for(Method m: methods){
if(m.getName().equals("setWindowLayoutType")) {
try{
m.invoke(getPopupWindow(), WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL);
}catch(Exception e){
e.printStackTrace();
}
break;
}
}
import android.support.v4.widget.PopupWindowCompat;
PopupWindowCompat.setWindowLayoutType(popupWindow, WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL);
public void compatibleSetWindowLayoutType(int layoutType) {
if (Build.VERSION.SDK_INT >= 23) {
setWindowLayoutType(layoutType);
} else {
try {
Class c = this.getClass();
Method m = c.getMethod("setWindowLayoutType", Integer.TYPE);
if(m != null) {
m.invoke(this, layoutType);
}
} catch (Exception e) {
}
}
}
使是互补的。该PopupWindowCompat.setWindowLayoutType
API 必须在 show popWindow 之前调用。