Ich versuche, Unterstützung für die SearchView
Android 3.0+ ActionBar hinzuzufügen, aber ich kann die nicht OnCloseListener
zum Laufen bringen .
Hier ist mein Code:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
searchView = (SearchView) menu.findItem(R.id.search_textbox).getActionView();
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
searchLibrary(newText);
return false;
}
@Override
public boolean onQueryTextSubmit(String query) { return false; }
});
searchView.setOnCloseListener(new OnCloseListener() {
@Override
public boolean onClose() {
System.out.println("Testing. 1, 2, 3...");
return false;
}
});
return true;
}
Die Suche funktioniert super und alle funktionieren bis auf die OnCloseListener
. In Logcat wird nichts gedruckt. Hier ist der Logcat, wenn ich auf die Schaltfläche "Schließen" drücke:
02-17 13:01:52.914: I/TextType(446): TextType = 0x0
02-17 13:01:57.344: I/TextType(446): TextType = 0x0
02-17 13:02:02.944: I/TextType(446): TextType = 0x0
Ich habe die Dokumentation und Beispiele durchgesehen , aber nichts schien daran etwas zu ändern. Ich verwende es auf einem Asus Transformer Prime und einem Galaxy Nexus, beide auf Ice Cream Sandwich. Irgendwelche Ideen?
Aktualisieren:
Ja - System.out.println()
funktioniert . Hier ist der Beweis:
@Override
public boolean onQueryTextChange(String newText) {
System.out.println(newText + "hello");
searchLibrary(newText);
return false;
}
Ergebnisse in diesem Logcat:
02-17 13:04:20.094: I/System.out(21152): hello
02-17 13:04:24.914: I/System.out(21152): thello
02-17 13:04:25.394: I/System.out(21152): tehello
02-17 13:04:25.784: I/System.out(21152): teshello
02-17 13:04:26.064: I/System.out(21152): testhello
showAsAction
istalways
. Das Suchfeld verfügt über eine eigene Schaltfläche zum Schließen. Wenn diese Option aktiviert ist, wirdifRoom | collapseActionView
sie in der Aktionsleiste erweitert.Antworten:
Ich treffe auch dieses Problem, und ich habe keine andere Wahl, als "oncloselistener" aufzugeben. Stattdessen können Sie dann Ihr menuItem abrufen
setOnActionExpandListener
. Überschreiben Sie dann nicht implementierte Methoden.quelle
if (Build.VERSION.SdkInt > BuildVersionCodes.NMr1) item.SetOnActionExpandListener(this); else MenuItemCompat.SetOnActionExpandListener(item, this);
Verwenden Sie für Android API 14+ (ICS und höher) diesen Code:
Weitere Informationen: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView
Ref: onActionCollapse / onActionExpand
quelle
Für dieses Problem habe ich mir so etwas ausgedacht,
quelle
Ich bin auf Android 4.1.1 auf dasselbe Problem gestoßen. Es scheint ein bekannter Fehler zu sein: https://code.google.com/p/android/issues/detail?id=25758
Wie auch immer, als Problemumgehung habe ich den Listener für Statusänderungen verwendet (wenn SearchView von der Aktionsleiste getrennt ist, ist es offensichtlich auch geschlossen).
Der obige Code hat in meinem Fall gut funktioniert.
Ich poste die gleiche Antwort hier: https://stackoverflow.com/a/24573266/2162924
quelle
Am Ende habe ich einen kleinen Hack verwendet, der für meinen Zweck gut funktioniert - ich bin mir nicht sicher, ob er für alle Zwecke geeignet ist. Wie auch immer, ich überprüfe, ob die Suchabfrage leer ist. Dies hängt jedoch nicht wirklich mit den
SearchView
's zusammenOnCloseListener
- das funktioniert immer noch nicht!quelle
Nun, das hat mein Problem gelöst:
Menüpunkt mit
showAsAction="always"
und in Aktivität
quelle
always
Werts auf einshowAsAction
Attribut löst das Problem. Wichtig ist, dass bei erweitertemalways
Wertis not
dieshowAsAction
erweiterteSearchView
Schaltfläche zum Schließen (Kreuzsymbol) nur angezeigtSearchView
wird, wenn die Abfrage in eine Zeichenfolge ungleich Null ist. DasSearchView.onCloseClicked
, das Ereignisse mit Schaltflächen zum Schließen behandelt, teilt mit, dass der Rückruf anOnCloseListener
nur aufgerufen wird, wenn die Abfrage leer ist, wenn dies nicht deronClose
OnCloseListener
OnCloseListener
Stellen Sie sicher, dass dies im Suchmenüelement festgelegtshowAsAction
ist , damit die Arbeit ausgeführt werden kannalways
.quelle
Ich habe das gleiche Problem festgestellt, wenn onCloseListener nicht für SearchView aufgerufen wurde. Um onCloseListener aufzurufen, müssen Sie Folgendes verstehen: Aus dem 25758 aufgetretenen Fehlerproblem und einigen von mir gelesenen Beiträgen müssen Sie Folgendes festlegen:
Aber für meinen Fall wollte ich, dass die Suchansicht geöffnet und nicht immer symbolisiert wird. Ich schaffe es, dies zu beheben, indem ich unten eine weitere Zeile hinzufüge:
Die searchView.setIconified (false) bewirkt, dass die searchView geöffnet wird, obwohl die Standardeinstellung in der vorherigen Zeile auf true gesetzt ist. Auf diese Weise gelang es mir, sowohl eine SearchView zu haben, die sich ständig öffnet, als auch den onCloseListener aufzurufen.
quelle
Erstellen Sie den Menüpunkt mit der
app:showAsAction
Einstellung immer.Machen Sie beim Erstellen der
SearchView
in deronCreateOptionsMenu
Methode etwas ÄhnlichesEs
search.setIconifiedByDefault(true)
muss festgelegt werden, dass die oben erstellte Methodetrue
aufgerufen wird .onClose()
SearchView.OnCloseListener()
quelle
Bei
MenuItemCompat
Problemen habe ich ViewTreeObserver hinzugefügt, um den Sichtbarkeitsstatus zu verfolgen. Sie können meine Antwort hier überprüfen: https://stackoverflow.com/a/28762632/1633609quelle
Der Grund, warum das
OnCloseListener
nicht aufgerufen wird, ist, dass der Android-Code einen Fehler enthält - der Listener wird nur aufgerufen, wenn Sie auch anrufensetIconifiedByDefault(true)
.quelle
scheint schon ein alter Thread zu sein, aber ich dachte, ich hätte am Anfang das gleiche Problem API 18. Nachdem ich herumgegoogelt habe, diesen Thread gefunden habe, habe ich eine weitere Stunde lang den Javadoc gelesen, der versucht und fehlerhaft für etwas war, das ich in Javadoc nicht vollständig verstehe, die folgende Arbeit für mich jetzt:
Ich habe ein bisschen mit wahr / falsch gespielt, das macht irgendwie den Unterschied und es funktioniert jetzt für mich. Hoffentlich könnte es jemandem Zeit sparen.
quelle
Es ist eine Problemumgehung, hat aber für mich funktioniert
quelle
Wenn Sie auf closeView klicken ->
D / Klick: Schließen geklickt
quelle
Ich bin auf dieses Problem gestoßen, als ich versucht habe, das Anzeigen / Löschen der SearchView zu erkennen. Am Ende habe ich einen anderen Hörer verwendet und es hat für das funktioniert, was ich brauche:
quelle
Ich habe die SearchView-Schaltfläche zum Schließen verwendet und einen setOnClickListener darauf gesetzt
quelle
In Android gibt es keine Konsole, bei der Sie sich anmelden können. Verwenden Sie stattdessen das Android-Protokollierungsframework:
Siehe auch diese Frage: Warum funktioniert "System.out.println" in Android nicht?
quelle
Es gibt zwei gängige Muster für
SearchView.setOnCloseListener()
. Dies gilt wirklich für alle Zuhörer, aber ich gehe speziell auf Ihre Frage ein. Die erste Möglichkeit besteht darin, eine Listener-Funktion zu erstellen und an eine Member-Variable anzuhängen. Die zweite Möglichkeit besteht darin, dass die Klasse die Schnittstelle implementiert und der Handler eine Member-Funktion ist.Das Erstellen eines Listener-Objekts sieht folgendermaßen aus:
Das Implementieren von Listener auf Klassenebene sieht folgendermaßen aus:
Ich habe keine Beispiele gesehen, die das
OnCloseListener
Ad-hoc erstellen , wie Sie es in Ihrer Frage getan haben.quelle