Modification de l'arrière-plan dessinable du widget searchview

122

J'essaye de changer le dessinable qui se trouve dans le widget searchview de la barre d'action Android.

Actuellement, cela ressemble à ceci: entrez la description de l'image ici

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?

Martyn
la source
1
Je crois que cet article de SO peut vous aider dans ce que vous voulez accomplir, si vous ne l'avez pas déjà vérifié.
Angelo
@Angelo Malheureusement, cela n'est pas possible avec l' SearchViewarrière-plan car il n'est pas disponible dans through R.styleable. Ma réponse ci-dessous décrit comment le faire dans le code.
vArDo
Comment avez-vous obtenu le texte "Entrez le nom du film"?
Zen
Vous pouvez définir le texte d'indication dans la vue de recherche comme ceci: SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) searchView.findViewById (android.support.v7.appcompat.R.id.search_src_text); searchAutoComplete.setHint ("texte d'indication");
Dominik

Réponses:

253

Intro

Malheureusement, il n'y a aucun moyen de définir SearchViewle 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, il selectableItemBackground est répertorié comme pouvant être stylisé dans R.stylable, alors que searchViewTextField(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 une No 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 SearchViewchamp 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é sur searchViewTextFieldet 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érieur SearchView, donc c'est plus indépendant de la version du SDK que le parcours des enfants (par exemple, utiliser searchView.getChildAt(0)pour obtenir la bonne vue SearchView), 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 SearchViewest 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_lightn'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é :

entrez la description de l'image ici

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.xmlavec le contenu suivant:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true"
        android:drawable="@drawable/textfield_search_selected_holo_light" />
    <item android:drawable="@drawable/textfield_search_default_holo_light" />
</selector>

Nous utiliserons le dessinable créé ci-dessus pour définir l'arrière-plan de la LinearLayoutvue contenant un champ de texte SearchView- son identifiant est android:id/search_plate. Alors, voici comment faire cela rapidement dans le code, lors de la création du menu d'options:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }       

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);

        // Getting SearchView from XML layout by id defined there - my_search_view in this case
        SearchView searchView = (SearchView) menu.findItem(R.id.my_search_view).getActionView();
        // Getting id for 'search_plate' - the id is part of generate R file,
        // so we have to get id on runtime.
        int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
        // Getting the 'search_plate' LinearLayout.
        View searchPlate = searchView.findViewById(searchPlateId);
        // Setting background of 'search_plate' to earlier defined drawable.            
        searchPlate.setBackgroundResource(R.drawable.textfield_searchview_holo_light);          

        return super.onCreateOptionsMenu(menu);
    }

}

Effet final

Voici la capture d'écran du résultat final:

entrez la description de l'image ici

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 SearchViewressemble la mise en page. Dans SearchView contructor, on peut trouver une ligne qui gonfle la mise en page:

inflater.inflate(R.layout.search_view, this, true);

Maintenant, nous savons que la SearchViewmise en page est dans le fichier nommé res/layout/search_view.xml. En regardant search_view.xml, nous pouvons trouver un LinearLayoutélément interne (avec id search_plate) qui contient à l' android.widget.SearchView$SearchAutoCompleteintérieur (ressemble à notre champ de texte de vue de recherche):

    <LinearLayout
        android:id="@+id/search_plate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:orientation="horizontal"
        android:background="?android:attr/searchViewTextField">

Maintenant, nous avons maintenant que l'arrière-plan est défini en fonction de l' searchViewTextFieldattribut du thème actuel .

Attribut d'enquête (est-il facilement paramétrable?)

Pour vérifier comment l' searchViewTextFieldattribut est défini, nous examinons res / values ​​/ themes.xml . Il existe un groupe d'attributs liés à SearchViewpar défaut Theme:

<style name="Theme">
    <!-- (...other attributes present here...) -->

    <!-- SearchView attributes -->
    <item name="searchDropdownBackground">@android:drawable/spinner_dropdown_background</item>
    <item name="searchViewTextField">@drawable/textfield_searchview_holo_dark</item>
    <item name="searchViewTextFieldRight">@drawable/textfield_searchview_right_holo_dark</item>
    <item name="searchViewCloseIcon">@android:drawable/ic_clear</item>
    <item name="searchViewSearchIcon">@android:drawable/ic_search</item>
    <item name="searchViewGoIcon">@android:drawable/ic_go</item>
    <item name="searchViewVoiceIcon">@android:drawable/ic_voice_search</item>
    <item name="searchViewEditQuery">@android:drawable/ic_commit_search_api_holo_dark</item>
    <item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>

Nous voyons que pour le thème par défaut, la valeur est @drawable/textfield_searchview_holo_dark. Pour la Theme.Lightvaleur 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 dans R.attr(et R.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:

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="AppTheme" parent="android:Theme.Light">
        <item name="android:searchViewTextField">@drawable/textfield_searchview_holo_light</item>
    </style>
</resources>

Que faut-il modifier?

Maintenant, nous savons que nous devrons accéder search_platepar 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 celui selectorqui 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.com

Personnalisation

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.

vArDo
la source
Votre code java ne fonctionnera pas, son SearchView est dans l'ActionBar et ne peut pas être trouvé avec la méthode findViewById. Mais le reste est correct!
VinceFR du
@VinceFR Merci de l'avoir signalé. Je ne l'ai pas remarqué (je me suis concentré sur SearchViewlui-même). Est-ce OK si je fusionne votre réponse (en remplaçant onCreateOptionsMenu) dans la mienne?
vArDo du
@VinceFR J'ai déplacé mon code de onCreate()méthode en onCreateOptionsMenu()méthode comme vous l'avez suggéré. A voté votre réponse.
vArDo
Merci beaucoup: D est-il possible de changer l'icône Mag et l'icône Close de la même manière?
Harsha MV
Comment changer une icône de loupe? J'essaye tout, mais je ne peux pas le changer ... Merci ... et comment faire cela dans la barre d'action sherlock?
Jovan
31

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.

  @Override
  public boolean onCreateOptionsMenu(Menu menu)
  {

    getMenuInflater().inflate(R.menu.main_menu, menu); 

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
    searchAutoComplete.setHintTextColor(Color.WHITE);
    searchAutoComplete.setTextColor(Color.WHITE);

    View searchplate = (View)searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);
    searchplate.setBackgroundResource(R.drawable.texfield_searchview_holo_light);

    ImageView searchCloseIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
    searchCloseIcon.setImageResource(R.drawable.abc_ic_clear_normal);

    ImageView voiceIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_voice_btn);
    voiceIcon.setImageResource(R.drawable.abc_ic_voice_search);

    ImageView searchIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
    searchIcon.setImageResource(R.drawable.abc_ic_search);


    return super.onCreateOptionsMenu(menu);
}
Abdul Rahman
la source
1
cela ne fonctionne pas pour search_mag_icon. Il donne "Le style contient une clé avec une entrée incorrecte: 0x01010479"
Lavanya
1
la plaque de recherche ne fonctionne pas pour moi (elle fait quelque chose mais je ne vois aucun changement à la ligne du bas), mais l'idée générale d'AppCompat est très utile
guy_m
14

Votre onCreateOptionsMenuméthode doit être:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.option, menu);
        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        int linlayId = getResources().getIdentifier("android:id/search_plate", null, null);
        ViewGroup v = (ViewGroup) searchView.findViewById(linlayId);
        v.setBackgroundResource(R.drawable.searchviewredversion);
        return super.onCreateOptionsMenu(menu);
    }

où votre élément de recherche est menu_searchhors course

et voici la searchviewredversion(celle-ci est la version xhdpi): http://img836.imageshack.us/img836/5964/searchviewredversion.png

entrez la description de l'image ici

VinceFR
la source
existe-t-il un moyen de changer l'icône de recherche et le bouton Fermer de la même manière?
Harsha MV
Je ne sais pas pour le SherlockActionBar 4.2 Mais oui, vous pouvez changer l'icône de recherche et le bouton de fermeture de la même manière!
VinceFR
ActionbarSherlock a ses propres thèmes et définit son propre SearchView. Cela signifie que vous pouvez simplement ajouter un élément à votre thème nommé searchViewTextField et en utilisant la définition dessinable et les 9 correctifs ci-dessus.
NKijak
1
N'oubliez pas de renommer le fichier en searchviewredversion.9.png pour indiquer d'exporter l'élément en tant que correctif 9
1owk3y
13

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:

public static void styleSearchView(SearchView searchView, Context context) {
    View searchPlate = searchView.findViewById(R.id.abs__search_plate);
    searchPlate.setBackgroundResource(R.drawable.your_custom_drawable);
    AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
    searchText.setHintTextColor(context.getResources().getColor(R.color.your_custom_color));
}
David Vávra
la source
où dois-je mettre ce code? j'essaye de faire ceci dans la version 4.2 de la barre d'action. ma question stackoverflow.com/questions/13992424/…
Harsha MV
Bonjour, appelez-le à partir de la méthode onCreateOptionsMenu. Recherchez searchView et transmettez-le à cette méthode.
David Vávra
Je vous remercie. Toute idée de comment supprimer ce symbole Mag en ligne comme indiqué ici i.imgur.com/YvBz2.png
Harsha MV
3
Avec ABS, vous étendrez Theme.Sherlock ou Theme.Sherlock.Light pas les thèmes Android. Cela signifie que tout ce que vous avez à faire est d'ajouter un élément nommé searchViewTextField à la définition de thème de vos applications. Tout est fait en XML sans code requis.
NKijak
5

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 searchPlatevia, getIdentifier()alors je l'ai fait de cette façon:

View searchPlate = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);
Je fais
la source
3

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:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
  <shape >
      <solid android:color="@color/blue_color" />
  </shape>
</item>
<item android:bottom="0.8dp"
  android:left="0.8dp"
  android:right="0.8dp">
  <shape >
      <solid android:color="@color/background_color" />
  </shape>
</item>

<!-- draw another block to cut-off the left and right bars -->
<item android:bottom="2.0dp">
  <shape >
      <solid android:color="@color/main_accent" />
  </shape>
 </item>
</layer-list>

Dans le dossier de valeurs styles_myactionbartheme.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="AppnewTheme" parent="Theme.AppCompat.Light">
    <item name="android:windowBackground">@color/background</item>
    <item name="android:actionBarStyle">@style/ActionBar</item>
    <item name="android:actionBarWidgetTheme">@style/ActionBarWidget</item>
</style> 
<!-- Actionbar Theme -->
<style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@color/main_accent</item>
    <!-- <item name="android:icon">@drawable/abc_ic_ab_back_holo_light</item> -->
</style> 
<style name="ActionBarWidget" parent="Theme.AppCompat.Light">
    <!-- SearchView customization-->
     <!-- Changing the small search icon when the view is expanded -->
    <!-- <item name="searchViewSearchIcon">@drawable/ic_action_search</item> -->
     <!-- Changing the cross icon to erase typed text -->
  <!--   <item name="searchViewCloseIcon">@drawable/ic_action_remove</item> -->
     <!-- Styling the background of the text field, i.e. blue bracket -->
    <item name="searchViewTextField">@drawable/bottom_border</item>
     <!-- Styling the text view that displays the typed text query -->
    <item name="searchViewAutoCompleteTextView">@style/AutoCompleteTextView</item>        
</style>

  <style name="AutoCompleteTextView" parent="Widget.AppCompat.Light.AutoCompleteTextView">
    <item name="android:textColor">@color/text_color</item>
  <!--   <item name="android:textCursorDrawable">@null</item> -->
    <!-- <item name="android:textColorHighlight">@color/search_view_selected_text</item> -->
</style>
</resources>

J'ai défini le fichier custommenu.xml pour afficher le menu:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:com.example.actionbartheme="http://schemas.android.com/apk/res-auto" >  

<item android:id="@+id/search"
      android:title="@string/search_title"
      android:icon="@drawable/search_buttonn" 
     com.example.actionbartheme:showAsAction="ifRoom|collapseActionView"   
                 com.example.actionbartheme:actionViewClass="android.support.v7.widget.SearchView"/>

Votre activité doit étendre ActionBarActivity au lieu d'Activité.

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    // Inflate the menu; this adds items to the action bar if it is present.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.custommenu, menu);
}

Dans le fichier manifeste:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppnewTheme" >

Pour plus d'informations, voir ici:
Ici http://www.jayway.com/2014/06/02/android-theming-the-actionbar/

Suhas Patil
la source
Consultez: stackoverflow.com/questions/8211929/… pour un autre exemple de LayerList.
Jared Burrows
3

Mettre à jour

Si vous utilisez AndroidX, vous pouvez le faire comme ceci

    View searchPlate = svSearch. findViewById(androidx.appcompat.R.id.search_plate);
    if (searchPlate != null) {
        AutoCompleteTextView searchText = searchPlate.findViewById(androidx.appcompat.R.id.search_src_text);
        if (searchText != null){
            searchText.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.edittext_text_size));
            searchText.setMaxLines(1);
            searchText.setSingleLine(true);
            searchText.setTextColor(getResources().getColor(R.color.etTextColor));
            searchText.setHintTextColor(getResources().getColor(R.color.etHintColor));
            searchText.setBackground(null);
        }
    }
Rashid
la source
2

Commençons par créer un fichier XML appelé search_widget_background.xml, à utiliser comme dessinable, c'est-à-dire sous répertoire dessinable.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="@color/red" />

</shape>

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:

    public boolean onCreateOptionsMenu(Menu menu) {

        SearchView searchView = (SearchView)menu.findItem(R.id.my_search_view).getActionView();
        Drawable d = getResources().getDrawable(R.drawable.search_widget_background);
        searchView.setBackground(d);
...
    }
Erol
la source
@shkschneider IMHO cela ne fonctionnera pas, car l'arrière-plan doit être défini sur un élément à l'intérieur SearchView(nommé search_plate), pas sur SearchViewlui-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).
vArDo du
Je n'ai pas remarqué que SearchView était dans ActionBar. Maintenant, cela devrait fonctionner.
Erol
@babatenor Cela ne fonctionnera pas car l'arrière-plan pour SearchViewlui-même sera toujours sous l'arrière-plan pour les éléments qui sont à l'intérieur SearchView. Il y a une LinearLayoutvue à l'intérieur SearchViewqui a un id search_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.
vArDo
Merci vArDo. Je connaissais la structure en couches de SearchView mais j'ai juste supposé que cela fonctionnerait (cela me paraissait logique au moins).
Erol
1
@babatenor Ce serait génial si cela fonctionnait, de sorte que tout ce piratage ne soit pas nécessaire :)
vArDo
1
public boolean onCreateOptionsMenu(Menu menu) {
........

        // Set the search plate color
        int linlayId = getResources().getIdentifier("android:id/search_plate", null, null);
        View view = searchView.findViewById(linlayId);
        Drawable drawColor = getResources().getDrawable(R.drawable.searchcolor);
        view.setBackground( drawColor );
........
    }

et voici le fichier searchablecolor.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item>
      <shape >
          <solid android:color="#ffffff" />
      </shape>
  </item>

  <!-- main color -->
  <item android:bottom="1.5dp"
      android:left="1.5dp"
      android:right="1.5dp">
      <shape >
          <solid android:color="#2c4d8e" />
      </shape>
  </item>

  <!-- draw another block to cut-off the left and right bars -->
  <item android:bottom="18.0dp">
      <shape >
          <solid android:color="#2c4d8e" />
      </shape>
  </item>
</layer-list>
M.Raheel
la source
0

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.

<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
      <item name="searchViewStyle">@style/SearchView.ActionBar</item>
</style>

<style name="SearchView.ActionBar" parent="Widget.AppCompat.SearchView.ActionBar">
      <item name="queryBackground">@drawable/drw_search_view_bg</item>
      <item name="searchHintIcon">@null</item>
      <item name="submitBackground">@null</item>
      <item name="closeIcon">@drawable/vd_cancel</item>
      <item name="searchIcon">@drawable/vd_search</item>
</style>
E Player Plus
la source
0

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:

ImageView searchIconView = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_button);
searchIconView.setImageResource(R.drawable.yourIcon);

Si vous utilisez androidx, essayez ceci:

ImageView searchIconView = (ImageView) searchView.findViewById(androidx.appcompat.R.id.search_button);
    searchIconView.setImageResource(R.drawable.yourIcon);

Cela changera l'icône de serchview par défaut.

J'espère que ça aide!

Marawan Walid
la source