Подтвердить что ты не робот

PopupWindow z ordering

Я играю с меню, используя PopupWindow, которые перекрывают EditText.

Он отлично работает, за исключением того, что мой PopupWindow перекрывается некоторыми элементами из системы EditText IME (отметки выбора, кнопка Вставить).

Мой вопрос: как заставить z-порядок моего PopupWindow так, чтобы он отображался над этими украшениями?

Вот образ того, что происходит. Мне нужно, чтобы мой PopupWindow (меню) был нарисован поверх всего, поэтому каким-то образом скажите WindowManager, как заказать окна. Спасибо.

enter image description here

4b9b3361

Ответ 1

Нашел anwer сам.

Эти декорации являются нормальными PopupWindow-s, управляемыми EditText.

Z-порядок любого окна определяется WindowManager.LayoutParams.type, на самом деле он определяет цель Window. Допустимые диапазоны: FIRST_SUB_WINDOW - LAST_SUB_WINDOW для всплывающего окна.

Приложение обычно не может изменять "тип" PopupWindow, за исключением вызова скрытой функции PopupWindow.setWindowLayoutType(int) с использованием отражения Java, и установка желаемого типа окна.

Результат:

enter image description here

EDIT: Код, который делает это:

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

Ответ 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) {
        }
    }
}

Ответ 3

import android.support.v4.widget.PopupWindowCompat;

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