J'essaye de changer le dessinable qui se trouve dans le widget searchview de la barre d'action Android.
Actuellement, cela ressemble à ceci:
mais j'ai besoin de changer le fond bleu dessiné en une couleur rouge.
J'ai essayé beaucoup de choses sans lancer mon propre widget de recherche, mais rien ne semble fonctionner.
Quelqu'un peut-il m'indiquer la bonne direction pour changer cela?
SearchView
arrière-plan car il n'est pas disponible dans throughR.styleable
. Ma réponse ci-dessous décrit comment le faire dans le code.Réponses:
Intro
Malheureusement, il n'y a aucun moyen de définir
SearchView
le style de champ de texte à l'aide de thèmes, de styles et d'héritage en XML comme vous pouvez le faire avec l'arrière-plan des éléments dans la liste déroulante ActionBar . En effet, ilselectableItemBackground
est répertorié comme pouvant être stylisé dansR.stylable
, alors quesearchViewTextField
(attribut de thème qui nous intéresse) ne l'est pas. Ainsi, nous ne pouvons pas y accéder facilement à partir des ressources XML (vous obtiendrez uneNo resource found that matches the given name: attr 'android:searchViewTextField'
erreur).Définition de l'arrière-plan du champ de texte SearchView à partir du code
Ainsi, la seule façon de remplacer correctement l'arrière-plan du
SearchView
champ de texte est d'entrer dans ses éléments internes, d'acquérir un accès à une vue qui a un arrière-plan basé sursearchViewTextField
et de définir le nôtre.REMARQUE: La solution ci-dessous ne dépend que de l'id (
android:id/search_plate
) de l'élément à l'intérieurSearchView
, donc c'est plus indépendant de la version du SDK que le parcours des enfants (par exemple, utilisersearchView.getChildAt(0)
pour obtenir la bonne vueSearchView
), mais ce n'est pas à l'épreuve des balles. Surtout si un fabricant décide de réimplémenter les internes deSearchView
et l'élément avec l'ID mentionné ci-dessus n'est pas présent - le code ne fonctionnera pas.Dans le SDK, l'arrière-plan du champ de texte dans
SearchView
est déclaré via neuf correctifs , nous allons donc procéder de la même manière. Vous pouvez trouver des images png originales dans le répertoire drawable-mdpi du référentiel git Android . Nous sommes intéressés par deux images. Un pour l'état lorsque le champ de texte est sélectionné (nommé textfield_search_selected_holo_light.9.png ) et un pour l'endroit où il ne l'est pas (nommé textfield_search_default_holo_light.9.png ).Malheureusement, vous devrez créer des copies locales des deux images, même si vous souhaitez personnaliser uniquement l' état ciblé . C'est parce que
textfield_search_default_holo_light
n'est pas présent dans R.drawable . Il n'est donc pas facilement accessible via@android:drawable/textfield_search_default_holo_light
, qui pourrait être utilisé dans le sélecteur illustré ci-dessous, au lieu de référencer local drawable.REMARQUE: J'utilisais le thème Holo Light comme base, mais vous pouvez faire de même avec Holo Dark . Il semble qu'il n'y ait pas de réelle différence dans les 9 patches d' état sélectionnés entre les thèmes clairs et sombres . Cependant, il y a une différence entre les 9 correctifs pour l' état par défaut (voir Clair vs foncé ). Ainsi, il n'est probablement pas nécessaire de créer des copies locales de 9 correctifs pour l' état sélectionné , pour les thèmes sombres et clairs (en supposant que vous souhaitiez gérer les deux et les rendre tous les deux identiques à ceux du sélecteur de thème Holo ). Faites simplement une copie locale et utilisez-la danspouvant être dessiné pour les deux thèmes.
Maintenant, vous devrez modifier les neuf patchs téléchargés selon vos besoins (c'est-à-dire changer la couleur bleue en rouge). Vous pouvez jeter un œil au fichier à l'aide de l' outil draw 9-patch pour vérifier s'il est correctement défini après votre modification.
J'ai édité des fichiers à l'aide de GIMP avec l'outil crayon d'un pixel (assez facile) mais vous utiliserez probablement votre propre outil. Voici mon 9-patch personnalisé pour l' état ciblé :
REMARQUE: par souci de simplicité, je n'ai utilisé que des images pour une densité mdpi . Vous devrez créer 9 patchs pour plusieurs densités d'écran si vous voulez le meilleur résultat sur n'importe quel appareil. Les images pour Holo
SearchView
peuvent être trouvées dans mdpi , hdpi et xhdpi drawable.Maintenant, nous devrons créer un sélecteur dessinable, afin que l'image appropriée soit affichée en fonction de l'état d'affichage. Créez un fichier
res/drawable/texfield_searchview_holo_light.xml
avec le contenu suivant:Nous utiliserons le dessinable créé ci-dessus pour définir l'arrière-plan de la
LinearLayout
vue contenant un champ de texteSearchView
- son identifiant estandroid:id/search_plate
. Alors, voici comment faire cela rapidement dans le code, lors de la création du menu d'options:Effet final
Voici la capture d'écran du résultat final:
Comment j'y suis arrivé
Je pense que cela vaut la peine de savoir comment j'y suis arrivé, afin que cette approche puisse être utilisée lors de la personnalisation d'autres vues.
Vérification de la disposition de la vue
J'ai vérifié à quoi
SearchView
ressemble la mise en page. Dans SearchView contructor, on peut trouver une ligne qui gonfle la mise en page:Maintenant, nous savons que la
SearchView
mise en page est dans le fichier nomméres/layout/search_view.xml
. En regardant search_view.xml, nous pouvons trouver unLinearLayout
élément interne (avec idsearch_plate
) qui contient à l'android.widget.SearchView$SearchAutoComplete
intérieur (ressemble à notre champ de texte de vue de recherche):Maintenant, nous avons maintenant que l'arrière-plan est défini en fonction de l'
searchViewTextField
attribut du thème actuel .Attribut d'enquête (est-il facilement paramétrable?)
Pour vérifier comment l'
searchViewTextField
attribut est défini, nous examinons res / values / themes.xml . Il existe un groupe d'attributs liés àSearchView
par défautTheme
:Nous voyons que pour le thème par défaut, la valeur est
@drawable/textfield_searchview_holo_dark
. Pour laTheme.Light
valeur est également définie dans ce fichier .Maintenant, ce serait génial si cet attribut était accessible via R.styleable , mais malheureusement ce n'est pas le cas. A titre de comparaison, voir d' autres thèmes attributs qui sont présents à la fois dans themes.xml et R.attr comme textAppearance ou selectableItemBackground . Si
searchViewTextField
était présent dansR.attr
(etR.stylable
), nous pourrions simplement utiliser notre sélecteur dessinable lors de la définition du thème pour toute notre application en XML. Par exemple:Que faut-il modifier?
Maintenant, nous savons que nous devrons accéder
search_plate
par code. Cependant, nous ne savons toujours pas à quoi cela devrait ressembler. En bref, nous recherchons les drawables utilisés comme valeurs dans les thèmes par défaut: textfield_searchview_holo_dark.xml et textfield_searchview_holo_light.xml . En regardant le contenu, nous voyons que le dessinable est celuiselector
qui fait référence à deux autres dessinables (qui se trouvent être 9 patches plus tard) en fonction de l'état d'affichage. Vous pouvez trouver des tirables agrégés à 9 patchs de (presque) toutes les versions d'Android sur androiddrawables.comPersonnalisation
Nous reconnaissons la ligne bleue dans l' un des 9 patchs , nous en créons donc une copie locale et changeons les couleurs à votre guise.
la source
SearchView
lui-même). Est-ce OK si je fusionne votre réponse (en remplaçant onCreateOptionsMenu) dans la mienne?onCreate()
méthode enonCreateOptionsMenu()
méthode comme vous l'avez suggéré. A voté votre réponse.Les solutions ci-dessus peuvent ne pas fonctionner si vous utilisez la bibliothèque appcompat. Vous devrez peut-être modifier le code pour le faire fonctionner pour la bibliothèque appcompat.
Voici la solution de travail pour la bibliothèque appcompat.
la source
Votre
onCreateOptionsMenu
méthode doit être:où votre élément de recherche est
menu_search
hors courseet voici la
searchviewredversion
(celle-ci est la version xhdpi): http://img836.imageshack.us/img836/5964/searchviewredversion.pngla source
La solution ci-dessus ne fonctionne pas avec ActionBarSherlock 4.2 et n'est donc pas rétrocompatible avec Android 2.x. Voici le code de travail qui configure l'arrière-plan de SearchView et le texte d'indication sur ActionBarSherlock 4.2:
la source
Je suis fatigué de faire ça aussi et j'utilise la v7. L'application s'est plantée lorsque j'ai essayé de saisir le
searchPlate
via,getIdentifier()
alors je l'ai fait de cette façon:la source
J'ai également rencontré le même problème, j'ai utilisé la bibliothèque appcompat v7 et défini un style personnalisé pour cela. Dans le dossier drawable, placez le fichier bottom_border.xml qui ressemble à ceci:
Dans le dossier de valeurs styles_myactionbartheme.xml:
J'ai défini le fichier custommenu.xml pour afficher le menu:
Votre activité doit étendre ActionBarActivity au lieu d'Activité.
Dans le fichier manifeste:
Pour plus d'informations, voir ici:
Ici http://www.jayway.com/2014/06/02/android-theming-the-actionbar/
la source
Mettre à jour
Si vous utilisez AndroidX, vous pouvez le faire comme ceci
la source
Commençons par créer un fichier XML appelé search_widget_background.xml, à utiliser comme dessinable, c'est-à-dire sous répertoire dessinable.
Ce dessin sera utilisé comme arrière-plan de notre widget de recherche. J'ai défini la couleur sur rouge parce que c'est ce que vous avez demandé, mais vous pouvez la définir sur n'importe quelle couleur définie par la balise @color. Vous pouvez même le modifier davantage en utilisant les attributs définis pour la balise de forme (faire des coins arrondis, faire un fond ovale, etc.).
L'étape suivante consiste à définir l'arrière-plan de notre widget de recherche sur celui-ci. Cela peut être accompli comme suit:
la source
SearchView
(nommésearch_plate
), pas surSearchView
lui-même. Voir ma réponse pour plus de détails. Cependant, je dois admettre que je n'ai pas essayé d'utiliser la réponse de @ (baba ténor).SearchView
lui-même sera toujours sous l'arrière-plan pour les éléments qui sont à l'intérieurSearchView
. Il y a uneLinearLayout
vue à l'intérieurSearchView
qui a un idsearch_plate
, qui a cet élément de soulignement bleu comme arrière-plan. Voir ma réponse pour plus de détails. Donc, avec votre solution, le résultat est un fond bleu pour tout le widget avec un soulignement bleu toujours visible. J'ai testé sur Jelly Bean , mais je ne pense pas que la version cible du SDK compte ici.et voici le fichier searchablecolor.xml
la source
J'ai expliqué à la fin de cet article avec des images que cela s'applique aux formulaires xamarin. Mais je pense que vous pouvez le comprendre, car il est basé sur le code source de searchview d'Android
Comment modifier l'image du bouton d'annulation de la barre de recherche dans les formulaires Xamarin
la source
Si vous gonflez Searchview comme ceci "getMenuInflater (). Inflate (R.menu.search_menu, menu);". Ensuite, vous pouvez personnaliser cette vue de recherche via style.xml comme ci-dessous.
la source
J'ai beaucoup creusé à ce sujet et finalement j'ai trouvé cette solution et ça marche pour moi!
Vous pouvez utiliser ceci
Si vous utilisez appcompat, essayez ceci:
Si vous utilisez androidx, essayez ceci:
Cela changera l'icône de serchview par défaut.
J'espère que ça aide!
la source