2012-06-15 11 views
12

Ich spiele mit Menüs mit PopupWindow, die EditText überlappen.PopupWindow z Bestellung

Es funktioniert gut, außer dass mein PopupWindow von einigen Elementen aus EditText IME-System (Auswahlmarken, Schaltfläche Einfügen) überlappt wird.

Meine Frage ist: Wie erzwinge ich Z-Bestellung meines PopupWindow, so dass es über diesen Dekorationen erscheint?

Hier ist ein Bild von dem, was passiert. Ich brauche mein PopupWindow (das Menü), das über alles gezeichnet wird, also sage WindowManager irgendwie, wie man Fenster bestellt. Danke.

enter image description here

+0

Gute Frage. Leider denke ich, die Antwort wird sein, dass du es nicht wirklich kannst. Wenn es einen Weg gibt, um es zu tun, stelle ich mir vor, dass es nur auf Lager Android funktioniert. Die Text-Selektoren und Kontext-Pop-ups sind einige der Dinge, die Hersteller üblicherweise angepasste Versionen von auf ihrer Hardware einführen. Selbst wenn es einen Weg gibt, es zu tun, würde ich denken, dass es nicht für alle Gerätetypen wegen der Anpassung funktionieren wird, die sie zum EditText gemacht haben. – FoamyGuy

+0

Anpassungen sind irrelevant, technisch müssen diese Dinge irgendwie auf Android-Ebene gezeichnet werden, ich vermute, dass sie irgendwie android.view.Window sind und android.view.WindowManager verwenden. –

Antwort

7

anwer mich gefunden.

Diese Dekorationen sind normale PopupWindow-s, verwaltet von EditText.

Z-Reihenfolge von jedem Fenster wird durch WindowManager.LayoutParams.type definiert, eigentlich definiert es Zweck von Fenster. Gültige Bereiche sind FIRST_SUB_WINDOW - LAST_SUB_WINDOW für ein Popup-Fenster.

App kann den "Typ" PopupWindow normalerweise nicht ändern, außer dass die versteckte Funktion PopupWindow.setWindowLayoutType (int) mit Java-Reflektion aufgerufen und der gewünschte Fenstertyp eingestellt wird.

Ergebnis:

enter image description here

EDIT: Code, der das tut:

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

Könnten Sie bitte ein Code-Snippet bereitstellen, wie haben Sie das gemacht? – 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); 
Verwandte Themen