PopupWindow z订购

时间:2012-06-15 20:56:45

标签: android popupwindow android-windowmanager

我使用PopupWindow播放菜单,它与EditText重叠。

它工作正常,只是我的PopupWindow与EditText IME系统中的一些项目重叠(选择标记,粘贴按钮)。

我的问题是:如何强制我的PopupWindow进行z排序,使其显示在这些装饰上方?

这是正在发生的事情的形象。我需要在所有内容之上绘制我的PopupWindow(菜单),从而以某种方式告诉WindowManager如何订购窗口。 感谢。

enter image description here

4 个答案:

答案 0 :(得分:7)

我自己找到了。

这些装饰是普通的PopupWindow-s,由EditText管理。

任何Window的Z排序由WindowManager.LayoutParams.type定义,实际上它定义了Window的目的。弹出窗口的有效范围是FIRST_SUB_WINDOW - LAST_SUB_WINDOW。

除了使用Java反射调用隐藏函数PopupWindow.setWindowLayoutType(int)并设置所需的窗口类型之外,应用程序通常不能更改PopupWindow的“类型”。

结果:

enter image description here

修改 执行此操作的代码:

  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;
     }
  }

答案 1 :(得分:2)

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) {
        }
    }
}

答案 2 :(得分:0)

import android.support.v4.widget.PopupWindowCompat;

PopupWindowCompat.setWindowLayoutType(popupWindow, WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL);

答案 3 :(得分:0)

使是互补的。 PopupWindowCompat.setWindowLayoutType API必须在show popWindow之前调用。