J'essaie d'ajouter la prise en charge de la SearchView
barre d'action Android 3.0+, mais je ne parviens pas à faire OnCloseListener
fonctionner le.
Voici mon 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;
}
La recherche fonctionne très bien et tout fonctionne à l'exception du OnCloseListener
. Rien n'est imprimé sur Logcat. Voici le Logcat lorsque j'appuie sur le bouton "Fermer":
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
J'ai parcouru la documentation et les exemples, mais rien n'a semblé le changer. Je l'exécute sur un Asus Transformer Prime et un Galaxy Nexus, tous deux sur Ice Cream Sandwich. Des idées?
Mettre à jour:
Oui, System.out.println()
ça marche. Voici la preuve:
@Override
public boolean onQueryTextChange(String newText) {
System.out.println(newText + "hello");
searchLibrary(newText);
return false;
}
Résultats dans ce 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
android
android-3.0-honeycomb
android-4.0-ice-cream-sandwich
android-actionbar
Michell Bak
la source
la source
showAsAction
est réglé suralways
. La zone de recherche a son propre bouton de fermeture, mais si elle est définie,ifRoom | collapseActionView
elle se développe dans la barre d'action.Réponses:
Je rencontre également ce problème, et je n'ai pas d'autre choix que de renoncer à "oncloselistener". Au lieu de cela, vous pouvez obtenir votre menuItem, alors
setOnActionExpandListener
. Remplacez ensuite les méthodes non implémentées.la source
if (Build.VERSION.SdkInt > BuildVersionCodes.NMr1) item.SetOnActionExpandListener(this); else MenuItemCompat.SetOnActionExpandListener(item, this);
Pour l'API Android 14+ (ICS et supérieur), utilisez ce code:
Pour plus d'informations: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView
Réf: onActionCollapse / onActionExpand
la source
Pour ce problème, j'ai trouvé quelque chose comme ça,
la source
J'ai rencontré le même problème sur Android 4.1.1. On dirait qu'il s'agit d'un bogue connu: https://code.google.com/p/android/issues/detail?id=25758
Quoi qu'il en soit, comme solution de contournement, j'ai utilisé un écouteur de changement d'état (lorsque SearchView est détaché de la barre d'action, il est également fermé évidemment).
Le code ci-dessus a bien fonctionné dans mon cas.
Je poste la même réponse ici: https://stackoverflow.com/a/24573266/2162924
la source
J'ai fini par utiliser un peu de hack, cela fonctionne bien pour mon objectif - pas sûr que cela fonctionnera à toutes les fins. Quoi qu'il en soit, je vérifie si la requête de recherche est vide. Ce n'est pas vraiment lié au
SearchView
'sOnCloseListener
cependant - cela ne fonctionne toujours pas!la source
Eh bien, cela a résolu mon problème:
Élément de menu avec
showAsAction="always"
et en activité
la source
always
valeurshowAsAction
attributaire résout le problème. L'important est que lorsque laalways
valeuris not
présente dansshowAsAction
, développéSearchView
présente le bouton de fermeture (icône en forme de croix) uniquement si la requête dansSearchView
est une chaîne non nulle. LeSearchView.onCloseClicked
qui gère les événements du bouton de fermeture indique que le rappel àOnCloseListener
n'est appelé que si la requête est vide, si ce n'est pas le cas - il est d'abord effacé - mais ensuite, après avoir effacé la requête, le bouton de fermeture disparaît et nous ne pouvons pas fournir deonClose
rappel àOnCloseListener
Afin de faire le
OnCloseListener
travail, assurez-vous queshowAsAction
est défini suralways
dans l'élément de menu de recherche.la source
J'ai rencontré le même problème avec onCloseListener qui n'appelle pas pour SearchView. Comprenez à partir du problème de bogue soulevé dans 25758 et de certains messages que j'ai lus pour appeler onCloseListener, vous devez définir:
Mais pour mon cas, je voulais que la vue de recherche soit ouverte et non iconifiée tout le temps. Je parviens à résoudre ce problème en ajoutant une ligne supplémentaire ci-dessous:
Le searchView.setIconified (false) provoquera l'ouverture de searchView, malgré la définition de la valeur par défaut sur iconified sur true dans la ligne précédente. De cette façon, j'ai réussi à avoir à la fois un SearchView qui s'ouvre tout le temps et à l'invoquer onCloseListener.
la source
Créez l'élément de menu avec la valeur
app:showAsAction
toujours.Lors de la création
SearchView
de laonCreateOptionsMenu
méthode, faites quelque chose de similaireLe
search.setIconifiedByDefault(true)
doit être défini surtrue
pour appeler laonClose()
méthode sur leSearchView.OnCloseListener()
créé ci-dessus.la source
Pour le
MenuItemCompat
problème, j'ai ajouté ViewTreeObserver pour suivre l'état de visibilité. Vous pouvez vérifier ma réponse ici: https://stackoverflow.com/a/28762632/1633609la source
La raison pour laquelle le
OnCloseListener
n'est pas appelé est qu'il y a un bogue dans le code Android - l'auditeur n'est appelé que si vous appelez égalementsetIconifiedByDefault(true)
.la source
semble déjà un vieux fil, mais je pensais avoir le même problème API 18 au premier début. Après avoir cherché sur Google, trouvé ce fil, une autre heure a lu le javadoc essayé et a commis une erreur pour quelque chose que je ne prétends pas comprendre pleinement en javadoc, le travail suivant pour moi maintenant:
J'ai joué un peu avec vrai / faux, ça fait en quelque sorte la différence, et ça marche pour moi maintenant. Espérons que cela pourrait faire gagner du temps à quelqu'un.
la source
C'est une solution de contournement mais cela a fonctionné pour moi
la source
si vous cliquez sur fermer la rechercheView ->
D / clic: fermer cliqué
la source
J'ai rencontré ce problème en essayant de détecter l'affichage / le rejet de SearchView. J'ai fini par utiliser un auditeur différent et cela a fonctionné pour ce dont j'avais besoin:
la source
J'ai utilisé le bouton de fermeture SearchView et défini un setOnClickListener dessus
la source
Il n'y a pas de console dans Android pour se connecter. Utilisez plutôt le cadre de journalisation Android:
Voir aussi cette question: Pourquoi "System.out.println" ne fonctionne-t-il pas sous Android?
la source
Il existe deux modèles courants pour
SearchView.setOnCloseListener()
. C'est vraiment vrai pour tous les auditeurs, mais je réponds spécifiquement à votre question. La première consiste à créer une fonction d'écoute et à l'attacher à une variable membre, et la seconde consiste à faire en sorte que la classe implémente l'interface et que le gestionnaire soit une fonction membre.La création d'un objet écouteur ressemble à ceci:
L'implémentation de l'écouteur au niveau de la classe ressemble à ceci:
Je n'ai vu aucun exemple qui crée l'
OnCloseListener
ad-hoc, comme vous l'avez fait dans votre question.la source