2012-10-15 8 views
6

Ich habe diese PopupMenu in meiner Anwendung und möchte wissen, wann es geschlossen ist. Mit API14 + ist dies einfach, wenn Sie einen Ablehnungslistener mit setOnDismissListener() hinzufügen. Aber ich muss wissen, wenn das PopupMenu von API11 + geschlossen ist, so kann ich den Listener nicht verwenden und brauche eine Alternative für den Listener.Erkennen, dass ein PopupMenu auf API-Ebene 11 geschlossen ist

Das habe ich versucht, bereits zu:

  • Überschreibung der dismiss() Methode des PopupMenu, aber es wird nicht aufgerufen, wenn es geschlossen ist.
  • Verwenden Sie die PopupMenu.OnMenuItemClickListener, aber es wird nicht aktiviert, wenn der Benutzer außerhalb des Menüs geklickt hat (um es zu schließen) oder klickt auf "zurück".

Ich habe keine anderen Ideen zu erkennen, dass das Menü geschlossen war. Ich hoffe also, dass jemand anders einen cleveren Trick hat. Ansonsten kann ich nicht verwenden PopupMenu ...

+0

Ein bisschen hacky, aber können Sie einen 'OnFocusChangeListener' aus der zugrunde liegenden Ansicht oder Viewgroup setzen? Ich bin mir nicht sicher, ob es feuern wird, um ehrlich zu sein, aber es ist das erste, was mir einfällt. Ansonsten könntest du 3 Punkte hören (menuItemClick, back button, onTouch of contentView), aber ich bin mir sicher, dass es etwas besseres geben muss. – Geobits

+0

@Geobits Danke für deine Idee (ich hatte nicht daran gedacht). Aber die Verwendung des 'OnFocusChangeListener' funktioniert leider nicht. Ich habe nur eine Ansicht (auf der ich meine UI zeichne), und es scheint nicht, dass es jemals den Fokus bekommt (oder verliert) es ... – Veger

Antwort

1

Sie können versuchen Methode

public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) 

von PopupMenu Klasse außer Kraft zu setzen. Genau diese Methode ruft intern in API 14+ setOnDismissListener() auf. Aber das ist nicht einfach zu machen. Problem ist, welche Klasse com.android.internal.view.menu.MenuBuilder nicht in Android SDK enthalten ist. Daher können Sie Ihren Code nicht kompilieren, wenn Sie versuchen, diese Klasse zu importieren.

Allerdings können Sie Ihre eigene „fake“ Implementierung dieser Klasse erstellen, legen Sie sie in Paket com.android.internal.view.menu, machen Sie eine .jar Datei mit es, kopieren Sie diese „gefälschte Bibliothek“ auf libs Ordner und legen Umfang dieser Bibliothek in Projekteinstellungen von IntelliJ IDEA als "bereitgestellt". Dies bedeutet, dass Klassen in dieser jar Datei bereits echte Geräte haben (was wahr ist) und Sie sie nur benötigen, um Ihren Code zu kompilieren. Grundidee hier - Ihre gefälschte MenuBuilder sollte in Klassenpfad für javac Kompilation sein, sollte aber nicht in der resultierenden .apk Datei enthalten sein.

Dies ist keine einfache Lösung, aber es sollte funktionieren.

+0

Vielen Dank für Ihre Idee! Es könnte eine Lösung für mein Problem bieten, denke ich. Ich habe die falsche Implementierung für 'MenuBuilder' erstellt (nette Idee!), Aber ich kann die Einstellung des Bereichs nicht finden (es ist Maven-spezifisch? Ich benutze Maven nicht), könnten Sie darauf hinweisen, wo ich es finden sollte? Außerdem kann die 'onCloseMenu()' Methode nicht überschrieben werden, oder so scheint es. Das Entfernen der '@ Override'-Annotation löst dieses Problem, aber ich erhalte die Warnung, dass es nie verwendet wird. Ich nehme an, es funktioniert nicht? Alle zusätzlichen Details sind sehr willkommen! – Veger

+0

Nach einigen weiteren Tests arbeite ich an meinem API14 + -Gerät, aber nicht an einem API11-Gerät (für das sollte dies eine Lösung bieten). Könnte es sein, dass die API11 nicht die 'onCloseMenu()' Methode hat, also wird sie nicht aufgerufen? – Veger

+0

Sie können "scope" für Bibliotheken mindestens in IntelliJ IDEA konfigurieren. Ich denke, dass etwas Ähnliches möglich sein sollte, um Ant- oder Maven-Builds zu verwenden, indem ich das noch nicht ausprobiert habe. – HitOdessit