【问题标题】:PopupWindow z orderingPopupWindow z 排序
【发布时间】:2012-06-15 20:56:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 好问题。不幸的是,我认为答案将是你真的不能。如果有办法做到这一点,我想它可能只适用于股票 android。文本选择器和上下文弹出窗口是制造商通常在其硬件上引入定制版本的一些东西。即使有办法做到这一点,我猜它也不适用于所有设备类型,因为它们对 EditText 进行了自定义。
  • 自定义无关紧要,从技术上讲,这些东西必须在 Android 级别以某种方式绘制,我怀疑它们是一种 android.view.Window 并使用 android.view.WindowManager。

标签: android popupwindow android-windowmanager


【解决方案1】:

自己找到了答案。

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

任何Window的Z-ordering都是由WindowManager.LayoutParams.type定义的,实际上它定义了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;
     }
  }

【讨论】:

  • 能否请您提供一个代码 sn-p,您是如何做到的?
【解决方案2】:
import android.support.v4.widget.PopupWindowCompat;

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

【讨论】:

    【解决方案3】:
    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) {
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-09-07
        • 2010-12-13
        • 1970-01-01
        • 2019-12-08
        • 2021-11-22
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 2010-11-02
        相关资源
        最近更新 更多