2012-10-15 21 views
6

Tôi có số này PopupMenu trong đơn đăng ký của mình và muốn biết khi nào đóng cửa. Với API14 + điều này thật dễ dàng khi thêm người nghe sa thải với setOnDismissListener(). Nhưng, tôi cần biết khi nào PopupMenu bị đóng từ API11 +, vì vậy tôi không thể sử dụng trình nghe và cần một sự thay thế cho người nghe.Phát hiện thấy PopupMenu bị đóng ở cấp API 11

này tôi đã cố gắng đã đến:

  • ghi đè các dismiss() phương pháp của PopupMenu, nhưng nó không được gọi khi nó được đóng lại.
  • sử dụng PopupMenu.OnMenuItemClickListener nhưng không được kích hoạt khi người dùng nhấp vào bên ngoài menu (để đóng cửa sổ) hoặc nhấp vào 'quay lại'.

Tôi không có bất kỳ ý tưởng nào khác để phát hiện rằng trình đơn đã bị đóng. Vì vậy, tôi hy vọng rằng ai đó có một thủ thuật thông minh. Nếu không tôi không thể sử dụng PopupMenu ...

+0

Một chút hacky, nhưng bạn có thể đặt 'OnFocusChangeListener' từ chế độ xem hoặc nhóm xem cơ bản không? Tôi không chắc liệu nó có cháy hay không, thành thật mà nói, nhưng đó là điều đầu tiên tôi có thể nghĩ đến. Ngoài ra, bạn có thể nghe ở 3 điểm (menuItemClick, nút quay lại, onTouch của contentView), nhưng tôi chắc chắn rằng có một cái gì đó tốt hơn thế. – Geobits

+0

@Geobits Cảm ơn ý kiến ​​của bạn (Tôi đã không nghĩ về nó). Nhưng việc sử dụng 'OnFocusChangeListener' rất tiếc là không hoạt động. Tôi chỉ có một cái nhìn (mà tôi vẽ giao diện người dùng của tôi), và nó không có vẻ rằng nó bao giờ được tập trung (hoặc mất) nó ... – Veger

Trả lời

1

Bạn có thể thử ghi đè phương pháp

public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) 

của PopupMenu lớp. Chính xác phương pháp này đang gọi setOnDismissListener() nội bộ trong API 14+. Nhưng điều này là không dễ dàng để làm. Vấn đề là lớp com.android.internal.view.menu.MenuBuilder không được bao gồm trong Android SDK, do đó bạn sẽ không thể biên dịch mã của mình nếu bạn đang cố gắng nhập lớp này.

Tuy nhiên, bạn có thể tạo riêng của bạn "giả" thực hiện của lớp này, đặt nó trong gói com.android.internal.view.menu, tạo một tập tin .jar với nó, sao chép này "Thư viện giả" để libs thư mục và thiết lập phạm vi của thư viện này trong Cài đặt dự án của IntelliJ IDEA là "được cung cấp". Điều này có nghĩa là các lớp trong tệp jar này đã có các thiết bị thực (điều gì là đúng) và bạn chỉ cần chúng để biên dịch mã của bạn. Ý tưởng chính ở đây - giả mạo của bạn MenuBuilder phải ở trong classpath để biên soạn javac, nhưng nên không phải được bao gồm trong tệp .apk kết quả.

Đây không phải là giải pháp dễ dàng, nhưng nó sẽ hoạt động.

+0

Cảm ơn bạn đã cho ý tưởng của bạn! Nó có thể cung cấp một giải pháp cho vấn đề của tôi, tôi nghĩ vậy. Tôi đã tạo ra việc thực hiện giả cho 'MenuBuilder' (ý tưởng hay!), Nhưng tôi không thể tìm thấy thiết lập phạm vi (nó là Maven cụ thể? Tôi không sử dụng Maven), bạn có thể chỉ ra nơi tôi nên tìm nó? Hơn nữa, phương thức 'onCloseMenu()' không thể bị ghi đè, hoặc có vẻ như vậy. Việc xóa chú thích '@ Override' giải quyết vấn đề này, nhưng tôi nhận được cảnh báo rằng nó không bao giờ được sử dụng. Vì vậy, tôi cho rằng nó không hoạt động? Mọi chi tiết bổ sung đều rất được hoan nghênh! – Veger

+0

Sau một số thử nghiệm khác, tôi hoạt động trên thiết bị API14 + của mình, nhưng không hoạt động với thiết bị API11 (mà điều này sẽ cung cấp giải pháp). Nó có thể là trường hợp mà API11 không có phương thức 'onCloseMenu()', vì vậy nó không được gọi? – Veger

+0

Bạn có thể định cấu hình "phạm vi" cho các thư viện ít nhất trong IntelliJ IDEA. Tôi nghĩ rằng một cái gì đó tương tự nên có thể thực hiện bằng cách sử dụng Ant hoặc Maven xây dựng, bởi tôi đã không cố gắng này được nêu ra. – HitOdessit

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