Android SearchSuggestSelection active la requête commence par au lieu de contient la recherche
-
11-12-2019 - |
Question
J'utilise Android Rechercher un fournisseur de suggestions récentes et Configuration consultable pour afficher les recherches précédentes dans l'application et souhaite limiter les réponses suggérées aux seules entrées commençant par ?(ce que l'utilisateur tape)
actuellement, "p" renvoie téléphone, iPod, photo, heureux, et ce que je recherche, c'est juste un téléphone et une photo
Quelque chose d'équivalent à SQL comme % mais je n'arrive pas à faire fonctionner ça.
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/product_search_hint"
android:imeOptions="actionSearch"
android:label="@string/app_label"
android:searchSuggestAuthority="com.myapp.ProductSearchSuggestionProvider"
android:searchSuggestSelection="word MATCH ?" >
</searchable>
Essayé:
android:searchSuggestSelection="WORD LIKE '%'?"
La solution
Si vous implémentiez un fournisseur de suggestions entièrement personnalisé, l’application des personnalisations à ce niveau fonctionnerait comme prévu.Cependant, sous les couvertures, SearchRecentSuggestionsProvider interroge sa table locale avec les arguments codés en dur suivants (regarde):
- sélection = "affichage1 COMME ?"
- sélectionArgs = ["%{query}%"]
où {query} est la requête de recherche (elle est prise en sandwich entre deux signes pour cent afin que tout caractère correspondant n'importe où dans la chaîne compte).Il ignore la valeur transmise pour la chaîne de sélection (qui est celle que vous définissez avec le searchSuggestSelection
paramètre) et le tableau args (au-delà de vérifier s'il est vide), vous ne pouvez donc pas vraiment faire grand-chose à partir de XML.
Étant donné que l’implémentation ignore les paramètres entrants, il n’existe pas de solution ou de remplacement facile.Pour vous éviter un codage en double, je voudrais :
- Copiez l'intégralité de l'implémentation de
SearchRecentSuggestionsProvider
à partir du lien ci-dessus.Rien de ce que fait la classe ne doit être privé du framework, donc une copie directe doit être compilée. - Modifiez l'instruction de construction à partir du tableau args, à l'intérieur du
query()
méthode, êtreString like = selectionArgs[0] + "%"
au lieu deString like = "%" + selectionArgs[0] + "%"
(c'est à dire.supprimer le premier pour cent) - Sous-classe
ProductSearchSuggestionProvider
à partir de votre nouvelle implémentation à la place.
Autres conseils
Avez-vous essayé la concaténation de chaînes ?
word LIKE ? || '%'
||
est la concaténation de chaînes dans SQLite.