2012-06-15 9 views
12

Gram z menu za pomocą PopupWindow, które nakładają się na EditText.PopupWindow z zamawianiem

Działa dobrze, z tym że moje PopupWindow pokrywają się niektóre elementy z systemu EditText IME (znaczniki wyboru, przycisk Wklej).

Moje pytanie brzmi: w jaki sposób wymuszam porządkowanie Z w moim PopupWindow, aby pojawił się nad tymi dekoracjami?

Oto obraz tego, co się dzieje. Potrzebuję mojego PopupWindow (menu) narysowanego na górze wszystkiego, więc w jakiś sposób powiedz WindowManagerowi, jak zamawiać okna. Dzięki.

enter image description here

+0

dobre pytanie. Niestety myślę, że odpowiedź będzie taka, że ​​nie możesz tak naprawdę. Jeśli istnieje sposób, aby to zrobić, wyobrażam sobie, że może działać tylko na Androidzie. Selektory tekstowe i wyskakujące okienka kontekstowe to niektóre z rzeczy, które producenci zwykle wprowadzają niestandardowe wersje swoich urządzeń. Nawet jeśli istnieje sposób, aby to zrobić, domyślam się, że nie będzie działać dla wszystkich typów urządzeń z powodu dostosowania, które wprowadzili do EditText. – FoamyGuy

+0

Dostosowania są nieistotne, technicznie rzecz biorąc, te rzeczy muszą zostać narysowane w jakiś sposób na poziomie Androida, podejrzewam, że są w pewnym sensie android.view.Window i użyj android.view.WindowManager. –

Odpowiedz

7

Znaleziony anwer siebie.

Te dekoracje to normalne PopupWindow-s, zarządzane przez EditText.

Zamawianie okien dowolnych definiowane jest przez WindowManager.LayoutParams.type, w rzeczywistości definiuje cel okna. Prawidłowe zakresy to FIRST_SUB_WINDOW - LAST_SUB_WINDOW dla okna wyskakującego.

Aplikacja zazwyczaj nie może zmienić "typu" z PopupWindow, z wyjątkiem wywoływania funkcji ukrytej PopupWindow.setWindowLayoutType (int) za pomocą refleksji Java i ustawienia żądanego typu okna.

Wynik:

enter image description here

EDIT: Kod, który robi, że:

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

Czy możesz podać fragment kodu, jak to zrobiłeś? – 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); 
Powiązane problemy