2013-05-29 41 views
14

Tôi đang phát triển một ứng dụng cho Android và tôi đang sử dụng cửa sổ bật lên khi người dùng nhấp vào đối tượng thanh trình đơn cụ thể (bao gồm các hình ảnh nhỏ xếp hàng theo chiều ngang) ở cuối màn hình.Android - PopupWindow phía trên một chế độ xem cụ thể

Khi nhấp vào Tôi muốn cửa sổ bật lên được neo vào góc trên cùng bên trái của chế độ xem đã được nhấp và được hiển thị ở trên cùng.

Các phương pháp duy nhất mà dường như có liên quan showAsDropDown (Xem neo, int XOFF, int yoff)showAtLocation (Xem phụ huynh, int trọng lực, int x, int y). Vấn đề với showAsDropDown là nó được neo vào góc dưới cùng bên trái của khung nhìn.

Có cách nào khác để thực hiện việc này không?

Trả lời

25

popupWindow.showAtLocation(...) thực sự hiển thị cửa sổ hoàn toàn vị trí trên màn hình (thậm chí không phải là ứng dụng). Neo trong cuộc gọi đó chỉ được sử dụng cho mã thông báo cửa sổ của nó. Các tọa độ là bù từ trọng lực đã cho.

gì bạn thực sự muốn sử dụng là:

popupWindow.showAsDropDown(anchor, offsetX, offsetY, gravity); 

Cuộc gọi này chỉ có sẵn trong API 19+, vì vậy trong các phiên bản trước đó bạn cần phải sử dụng:

popupWindow.showAsDropdown(anchor, offsetX, offsetY); 

Những cuộc gọi hiển thị popup cửa sổ liên quan đến chế độ xem neo được chỉ định. Lưu ý rằng trọng lực mặc định (khi gọi mà không có lực hấp dẫn được chỉ định) là Gravity.TOP|Gravity.START vì vậy nếu bạn đang sử dụng rõ ràng Gravity.LEFT ở các vị trí khác nhau trong ứng dụng của bạn, bạn sẽ có một thời gian xấu :)

+1

Đó là cái tôi đang tìm kiếm. Tất cả những gì bạn cần tính toán là phần bù theo phần tử ui bạn sử dụng .. – Alpaslan

5

Loại bạn muốn sử dụng là showAtLocation(...). Bạn chỉ định chế độ xem neo (chế độ xem mà người dùng nhấp vào) và định vị nó liên quan đến thông số đó qua thông số và bù trừ số gravity. Hãy suy nghĩ về tham số gravity như PopupWindow gần giống như chế độ xem con và chế độ xem gốc giống như bố cục vùng chứa.

Bạn có thể đặt Gravity.LEFT | Gravity.TOP làm thông số.

+7

Không may mắn như vậy, PopupWindow sẽ hiển thị góc trên bên trái của cửa sổ với dòng đó (popupWindow.showAsLocation (anchor, Gravity.TOP | Gravity.LEFT, 0, 0)). –

1

popupwindow.showAsDropDown (anchor, 0, -125); việc điều này cho tôi

6
popupWindow.showAtLocation(anchor, Gravity.BOTTOM, 0, anchor.getHeight()); 
3

Bạn chỉ cần di chuyển popupWindow theo chiều cao neo bằng cách sử dụng thông số yoff trong cú pháp showAsDropDown (Xem neo, int xoff, int yoff).

popupWindow.showAsDropDown(anchor, 0, -anchor.getHeight()+popupView.getHeight); 

Ngoài ra, beaware rằng nếu chiều cao tối đa được phép neo không cho phép chuyển đổi, cửa sổ bật lên có thể không hiển thị chính xác.

+0

Vui lòng giải thích cách mã này trả lời câu hỏi (câu trả lời này nằm trong hàng đợi đánh giá Bài viết có chất lượng thấp). – JAL

3

Tôi có mã này: PopupĐây dưới một chế độ xem cụ thể (Trọng lực cuối) cho tất cả phiên bản sdk.

 // display the popup[![enter image description here][1]][1] 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      mPopupWindow.showAsDropDown(v, 0, 0, Gravity.END); 
     } else { 
      mPopupWindow.showAsDropDown(v, v.getWidth() - mPopupWindow.getWidth(), 0); 
     } 

Đây là v là ImageButton Calendar.

Các vấn đề liên quan