2012-06-15 19 views
12

Juego con menús usando PopupWindow, que se superponen con EditText.PopupWindow z ordenando

Funciona bien, excepto que mi ventana emergente está solapada por algunos elementos del sistema EditText IME (marcas de selección, botón Pegar).

Mi pregunta es: ¿cómo forzar z-orden de mi ventana emergente para que aparezca encima de esas decoraciones?

Aquí está la imagen de lo que está sucediendo. Necesito que mi PopupWindow (el menú) se dibuje encima de todo, por lo que de alguna manera le digo a WindowManager cómo ordenar ventanas. Gracias.

enter image description here

+0

Buena pregunta. Desafortunadamente, creo que la respuesta será que realmente no se puede. Si hay una manera de hacerlo, imagino que solo funcionará en Android. Los selectores de texto y las ventanas emergentes de contexto son algunas de las cosas que los fabricantes comúnmente presentan versiones personalizadas en su hardware. Incluso si hay una manera de hacerlo, supongo que no funcionará para todos los tipos de dispositivos debido a la personalización que han hecho a EditText. – FoamyGuy

+0

Las personalizaciones son irrelevantes, técnicamente esas cosas deben dibujarse de alguna manera a nivel de Android, sospecho que son un poco android.view.Window y usan android.view.WindowManager. –

Respuesta

7

Encontrado anwer mí mismo.

Esas decoraciones son PopupWindow-s normales, administradas por EditText.

El orden Z de cualquier ventana se define en WindowManager.LayoutParams.type, en realidad define el propósito de la ventana. Los rangos válidos son FIRST_SUB_WINDOW - LAST_SUB_WINDOW para una ventana emergente.

La aplicación normalmente no puede cambiar el "tipo" de PopupWindow, excepto llamar a la función oculta PopupWindow.setWindowLayoutType (int) usando la reflexión de Java y establecer el tipo de ventana deseado.

Resultado:

enter image description here

EDIT: código que hace que:

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

¿Podría proporcionar un fragmento de código, cómo lo ha hecho? – halxinate

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) { 
     } 
    } 
} 
0
import android.support.v4.widget.PopupWindowCompat; 

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