2012-06-15 31 views
12

Tôi phát với các menu sử dụng PopupWindow, chồng lên EditText.PopupWindow z đặt hàng

Nó hoạt động tốt, ngoại trừ PopupWindow của tôi bị chồng chéo bởi một số mục từ hệ thống IME EditText (dấu chọn, nút Dán).

Câu hỏi của tôi là: làm cách nào để buộc z-đặt hàng PopupWindow của tôi để nó xuất hiện phía trên các đồ trang trí đó?

Đây là hình ảnh về những gì đang diễn ra. Tôi cần PopupWindow của tôi (menu) được vẽ trên đầu trang của tất cả mọi thứ, do đó bằng cách nào đó nói với WindowManager làm thế nào để đặt hàng các cửa sổ. Cảm ơn.

enter image description here

+0

Tốt câu hỏi. Thật không may tôi nghĩ rằng câu trả lời là có được rằng bạn có thể không thực sự. Nếu có một cách để làm điều đó tôi tưởng tượng rằng nó chỉ có thể làm việc trên android chứng khoán. Bộ chọn văn bản và cửa sổ bật lên ngữ cảnh là một số điều mà các nhà sản xuất thường giới thiệu các phiên bản tùy chỉnh trên phần cứng của họ. Ngay cả khi có một cách để làm điều đó, tôi sẽ đoán rằng nó sẽ không làm việc cho tất cả các loại thiết bị vì tùy biến mà họ đã thực hiện cho EditText. – FoamyGuy

+0

Tùy chỉnh không liên quan, về mặt kỹ thuật, những thứ đó phải được vẽ bằng cách nào đó ở cấp Android, tôi nghi ngờ chúng là loại android.view.Window và sử dụng android.view.WindowManager. –

Trả lời

7

Tìm thấy bản thân mình.

Trang trí đó là PopupWindow bình thường, được EditText quản lý.

Thứ tự Z của bất kỳ Cửa sổ nào được xác định bởi WindowManager.LayoutParams.type, thực tế nó xác định mục đích của Window. Phạm vi hợp lệ là FIRST_SUB_WINDOW - LAST_SUB_WINDOW cho cửa sổ bật lên.

Ứng dụng thường không thể thay đổi "loại" của PopupWindow, ngoại trừ gọi hàm ẩn PopupWindow.setWindowLayoutType (int) bằng cách sử dụng phản chiếu Java và đặt loại cửa sổ mong muốn.

Kết quả:

enter image description here

EDIT: Mã nào đó:

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

Bạn có thể vui lòng cung cấp đoạn mã, cách bạn đã thực hiện điều đó không? – 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);