Comment construire Gmail comme zone de recherche dans la barre d'action?
Je suis actuellement en utilisant SearchView
widget à l'intérieur de ActionBarcompat
pour filtrer une liste lors de la recherche.
Lorsque l'utilisateur commence à entrer le texte de la liste dans la page principale des mises à jour avec un Adaptateur pour filtrer les résultats. Je fais cela par la mise en œuvre d'un OnQueryTextListener
et de filtrer les résultats sur chaque touche.
Au lieu de cela, je veux créer un compte Gmail comme champ de recherche avec de suggestion automatique de la liste générée et pas de changements de la vision sous-jacente
J'ai passé à travers ce tutoriel qui utilise le SearchView
composant, mais il nécessite un consultable activité. Je veux la liste déroulante pour être sur le MainActivity où j'ai de la liste (comme dans l'application Gmail) et non pas une Activité dédiée.
En outre, la mise en œuvre de la même manière que dans le tutoriel semble comme un overkill pour ce que je veux (juste une liste déroulante)
Vous devez vous connecter pour publier un commentaire.
Si vous voulez juste un composant qui fait ce qui est décrite dans la question, je suggère ce bibliothèque. Vous pouvez également mettre en œuvre la dehors-de-le-bx consultable interface, cependant, sachez qu'il dispose de l'INTERFACE utilisateur: les limites de
De mettre en œuvre une interface similaire à l'Application Gmail, vous aurez à comprendre conceps de:
Résultat Final devrait ressembler à quelque chose comme:
Il y a beaucoup (beaucoup) de trouver des moyens pour obtenir le même résultat (ou mieux), je vais décrite une manière possible.
Partie 01: Mise En Page
J'ai décidé de gérer l'ensemble de l'interface dans une nouvelle Activité, pour qui j'ai créé trois layouts XML:
custom_searchable.xml: assemblys tous les éléments de l'INTERFACE utilisateur dans un RelativeLayout qui servira de contenu pour la SearchActivity;
custom_searchable_header_layout.xml: contient la barre de recherche où l'utilisateur va taper sa requête. Il contient également le mic, d'effacer et de retour btn;
custom_searchable_row_details.xml: contient les éléments de l'INTERFACE utilisateur à afficher dans la liste de résultats sera affichée en réponse à la requête de l'utilisateur;
Partie 02: la mise en Œuvre de la SearchActivity
L'idée est que, lorsque l'utilisateur tape sur le bouton de recherche (que vous pouvez placer n'importe où vous voulez), ce SearchActivity sera appelée. Il a une certaine principales responsabilités:
Se lier à des éléments de l'INTERFACE utilisateur dans le custom_searchable_header_layout.xml: en faisant cela, il est possible:
pour offrir aux auditeurs pour l'EditText (où l'utilisateur va taper sa requête):
ajout d'un écouteur pour le bouton de retour (qui, par son tour appelez simplement terminer() et retourne à l'appelant de l'activité):
appelle l'intention de google de discours-à-texte de l'API:
Fournisseur De Contenu
Lors de la construction de l'une interface de recherche, le développeur a typiquement deux options:
Dans les deux cas, les réponses doivent être livrés à l'arrière comme un objet Curseur qui aura son contenu affiché comme itens dans la liste des résultats. Tout ce processus peut être mettre en œuvre en utilisant le Fournisseur de Contenu de l'API. Les détails sur la façon d'utiliser les Fournisseurs de Contenu peut être atteint dans ce lien.
Dans le cas où le réalisateur veut mettre en œuvre le comportement décrit dans 1., il peut être utile d'utiliser la stratégie de exteding la SearchRecentSuggestionsProvider classe. Les détails sur la façon de le faire peut être atteint dans ce lien.
La mise en œuvre de l'interface de recherche
Cette interface doit fournir le comportement suivant:
Lorsque l'utilisateur tape une lettre, un appel à la méthode de requête de l'extrait de fournisseur de contenu de classe doit retourner une fois rempli, un curseur avec la suggestion à afficher dans la liste, vous devriez prendre pour ne pas geler le thread de l'INTERFACE utilisateur, donc je recommande d'effectuer cette recherche dans une AsyncTask:
À l'intérieur de la onPostExecute() la méthode de votre AsyncTask, vous devez récupérer une liste (qui doit venir de la doInBackground () (méthode) contenant les résultats affichés dans le ResultList (vous pouvez mapper une classe POJO et de le passer à votre adaptateur personnalisé, ou vous pouvez utiliser un CursorAdapter qui serait la meilleure pratique en la matière pour cette tâche):
Identifier lorsque l'utilisateur appuie sur le bouton de recherche à partir du clavier virtuel. Quand il fait ça, envoyer une intention de recherche de la base de l'activité (le seul responsable de la gestion du résultat de recherche) et ajoutez la requête que des informations supplémentaires à l'intention
Identifier lorsque l'utilisateur clique sur l'une de ces suggestions et de l'envoyer et l'intention contenant les informations de l'élément (cette intention doit être différent de celui de l'étape précédente)
L'décrite étapes devrait être suffisant pour la mise en œuvre d'une interface de soi même. Tous les exemples de code ont été prises à partir de ici. J'ai fait cette bibliothèque qui fait à peu près de ce qui est décrit ci-dessus. Il n'est pas encore testé et certains de la configuration de l'INTERFACE utilisateur pourrait ne pas être encore disponibles.
J'espère que cette réponse pourrait aider quelqu'un dans le besoin.
J'ai mis en place un petit tutoriel pour faire
http://drzon.net/how-to-create-a-clearable-autocomplete-dropdown-with-autocompletetextview/
Aperçu
J'ai dû remplacer le
SearchView
avecAutoCompleteTextView
comme le suggère.Tout d'abord, créez un adaptateur. Dans mon cas, c'était un
JSONObject
ArrayAdapter. Les données que je voulais à afficher dans la liste déroulante, était un lieu nom et l'adresse du site. Notez que la carte doit êtreFiltarable
et remplacergetFilter()
Ici est la coutume
VenueFilter
:Maintenant définir la mise en page de la zone de recherche (
actionbar_search.xml
) :Et la mise en page pour chaque déroulant élément (nom du site et adresse de lieu). Celui-ci semble mauvais, vous devrez le personnaliser:
Ensuite, nous voulons le mettre dans la barre d'action
C'est à ce sujet, j'ai encore quelques trucs à découvrir :
SearchView
widget - une loupe en verre qui s'ouvre jusqu'à une zone de recherche lorsque vous cliquez dessus (et qui a une petiteX
bouton pour la fermer et revenir à la normale)Globale cela permet d'économiser la totalité des frais généraux de la création d'un consultable activité. S'il vous plaît ajouter si vous savez comment le personnaliser, etc.
Si vous souhaitez mettre en œuvre uniquement déroulant effet aller pour AutoCompleteTextView
Et vous pouvez trouver un bon tutoriel ici
Alors si vous souhaitez mettre en place exacte de la conception que vous avez à mettre en œuvre ActionBar
et si vous voulez mettre en œuvre pour abaisser la version u nécessité de mettre en œuvre ActionBarCombat
au lieu de ActionBar
ActionBarCompat
Vous devez utiliser ListPopupWindow et l'ancrer à l'affichage de la recherche widget.
J'ai utilisé avec succès Michaels réponse (https://stackoverflow.com/a/18894726/2408033) mais je n'ai pas aimé la façon dont manuel il a été, en gonflant les points de vue et de l'ajouter à l'actionbar, le basculement de son état, etc.
Je l'ai modifié pour utiliser une ActionBar ActionView au lieu d'ajouter de vue manuellement à l'actionbar/barre d'outils.
Je trouve que cela fonctionne beaucoup mieux depuis que je n'ai pas besoin de gérer l'ouverture/fermeture de l'état et de cacher des points de vue comme il l'a fait dans son exemple dans le toggleSearch à la méthode d'ajout d'un lien. Il fonctionne également parfaitement avec le bouton de retour.
Dans mon menu.xml
Dans mon onCreateOptionsMenu
Vous pouvez trouver la version complète de la mise en œuvre de mon projet. Remarque: il existe deux points de vue que j'ai été en utilisant la réelle SearchView pour filtrer une liste.
https://github.com/babramovitch/ShambaTimes/blob/master/app/src/main/java/com/shambatimes/schedule/MainActivity.java
Veuillez vous référer à cet exemple qui implémente exactement ce dont vous avez demandé:
http://wptrafficanalyzer.in/blog/android-searchview-widget-with-actionbarcompat-library/
Vous devez utiliser
collapseActionView
attribut.Par exemple: