2012-06-15 3 views
12

나는 EditText와 겹치는 PopupWindow를 사용하여 메뉴를 사용하여 연주합니다.PopupWindow z ordering

내 PopupWindow가 EditText IME 시스템의 일부 항목 (선택 표시, 붙여 넣기 단추)에 의해 겹쳐져 있다는 점을 제외하고는 정상적으로 작동합니다.

제 질문은 : PopupWindow를 위의 장식 위에 나타나게하려면 어떻게해야합니까?

여기에 무슨 일이 일어나고 있는지 이미지가 있습니다. 내 PopupWindow (메뉴) 모든 위에 그려져 있어야합니다, 어떻게 든 WindowManager에 창을 주문하는 방법을 말해. 감사합니다. .

enter image description here

+0

좋은 질문을. 불행히도 그 대답은 당신이 정말로 할 수 없다고 생각합니다. 그것을 할 수있는 방법이 있다면 그것은 재고 안드로이드에서만 작동한다고 상상해보십시오. 텍스트 선택기와 컨텍스트 팝업은 제조업체가 일반적으로 하드웨어에 맞춤 버전을 도입하는 몇 가지 사항입니다. 그것을 할 수있는 방법이 있더라도 EditText에 대한 사용자 정의로 인해 모든 장치 유형에서 작동하지 않는다고 생각합니다. – FoamyGuy

+0

커스터마이제이션은 관련이 없습니다. 기술적으로 안드로이드 레벨에서 어떻게 든 그려야합니다. 나는 그들이 일종의 android.view.Window라고 의심합니다. android.view.WindowManager를 사용하십시오. –

답변

7

자신 anwer 발견.

이러한 장식은 EditText에서 관리하는 일반적인 PopupWindow-s입니다.

모든 윈도우의 Z 순서는 WindowManager.LayoutParams.type으로 정의되며 실제로는 Window의 목적을 정의합니다. 유효한 범위는 팝업 창에 대한 FIRST_SUB_WINDOW - LAST_SUB_WINDOW입니다.

응용 프로그램은 보통 Java 반사를 사용하여 숨겨진 함수 PopupWindow.setWindowLayoutType (int)을 호출하고 원하는 창 유형을 설정하는 것을 제외하고는 PopupWindow의 "유형"을 변경할 수 없습니다.

결과 :

enter image description here

편집 : 코드가 수행합니다

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

코드 스 니펫을 제공해 주시겠습니까? – 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);