2012-10-15 58 views
6

我的應用程序中有此PopupMenu,並且想知道它何時關閉。 使用API​​14 +,在setOnDismissListener()添加解僱監聽器時很容易。 但是,我需要知道何時從API11 +關閉PopupMenu,所以我不能使用偵聽器,並且需要偵聽器的替代方案。檢測到API級別11上的PopupMenu已關閉

這個我已經嘗試:

  • 覆蓋的彈出菜單的dismiss()方法,但是當它被關閉,那不叫。
  • 使用PopupMenu.OnMenuItemClickListener,但當用戶在菜單外單擊(關閉它)或單擊「返回」時,它不會被激活。

我沒有任何其他想法檢測到菜單已關閉。所以我希望別人有一個聰明的把戲。否則,我不能使用PopupMenu的...

+0

有點不好意思,但是你能從底層視圖或視圖組中設置一個'OnFocusChangeListener'嗎?老實說,我不確定它會不會起火,但這是我能想到的第一件事。除此之外,你可以聽3點(menuItemClick,後退按鈕,contentView的onTouch),但我相信肯定會有比這更好的東西。 – Geobits

+0

@Geobits感謝您的想法(我沒有想到它)。但不幸的是,使用'OnFocusChangeListener'不工作。我只有一個視圖(我在其上繪製了我的用戶界面),它似乎沒有得到它的焦點(或失去)它... – Veger

回答

1

你可以嘗試重寫方法

public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) 
PopupMenu

。確切地說,這個方法在API 14+內部調用setOnDismissListener()。但這並不容易。問題是什麼類com.android.internal.view.menu.MenuBuilder不包含在Android SDK中,所以如果您嘗試導入此類,則將無法編譯您的代碼。

但是,您可以創建自己的「假」實施這一類的,把它放在包com.android.internal.view.menu,使.jar文件有了它,這個「假圖書館」複製到libs文件夾,並設置該庫中項目設置的範圍IntelliJ IDEA的「提供」。這意味着這個jar文件中的類已經具有真實的設備(什麼是真的),並且您只需要它們來編譯您的代碼。這裏的主要想法 - 你的假應該在編譯javac的類路徑,但被包括在結果.apk文件。

這不是一個簡單的解決方案,但它應該可以工作。

+0

謝謝你的主意!它可以爲我的問題提供解決方案,我想。我爲'MenuBuilder'創建了假實現(好主意!),但是我找不到範圍設置(它是Maven特有的?我沒有使用Maven),你能指出我應該在哪裏找到它嗎?此外,'onCloseMenu()'方法不能被覆蓋,或者看起來如此。刪除'@ Override'註解解決了這個問題,但是我得到了從未使用過的警告。所以我想這不起作用?任何額外的細節都非常受歡迎! – Veger

+0

經過一些更多的測試後,我在API14 +設備上工作,但沒有使用API​​11設備(爲此應該提供解決方案)。是不是API11沒有'onCloseMenu()'方法,所以它沒有被調用? – Veger

+0

至少在IntelliJ IDEA中,您可以爲庫配置「範圍」。我認爲應該可以使用Ant或Maven構建來實現類似的功能,因爲我還沒有嘗試過。 – HitOdessit