Modifica dello sfondo disegnabile del widget searchview


122

Sto cercando di cambiare il disegnabile che si trova nel widget searchview della barra delle azioni di Android.

Attualmente assomiglia a questo: inserisci qui la descrizione dell'immagine

ma ho bisogno di cambiare lo sfondo blu disegnabile in un colore rosso.

Ho provato molte cose a parte il rollio del mio widget di ricerca, ma niente sembra funzionare.

Qualcuno può indicarmi la giusta direzione per cambiare questo?


1
Credo che questo post SO possa aiutarti con ciò che vuoi ottenere, se non l'hai già controllato.
Angelo

@Angelo Sfortunatamente, questo non è possibile con lo SearchViewsfondo perché non è disponibile in attraverso R.styleable. La mia risposta di seguito descrive come farlo in codice.
vArDo

Come hai ricevuto il testo "Inserisci il nome del film"?
Zen

È possibile impostare il testo del suggerimento nella vista di ricerca in questo modo: SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) searchView.findViewById (android.support.v7.appcompat.R.id.search_src_text); searchAutoComplete.setHint ("testo suggerimento");
Dominik

Risposte:


253

Intro

Sfortunatamente non c'è modo di impostare lo SearchViewstile del campo di testo usando temi, stili ed ereditarietà in XML come puoi fare con lo sfondo degli elementi nel menu a discesa ActionBar . Questo perché selectableItemBackground è elencato come stilizzabile in R.stylable, mentre searchViewTextField(attributo del tema a cui siamo interessati) non lo è. Pertanto, non possiamo accedervi facilmente dalle risorse XML (riceverai un No resource found that matches the given name: attr 'android:searchViewTextField'errore).

Impostazione dello sfondo del campo di testo di SearchView dal codice

Quindi, l'unico modo per sostituire correttamente lo sfondo del SearchViewcampo di testo è entrare nei suoi interni, acquisire l'accesso alla visualizzazione che ha lo sfondo impostato in base searchViewTextFielde impostare il nostro.

NOTA: la soluzione seguente dipende solo dall'id ( android:id/search_plate) dell'elemento all'interno SearchView, quindi è più indipendente dalla versione dell'SDK rispetto all'attraversamento dei figli (ad esempio, utilizzando searchView.getChildAt(0)per arrivare alla vista giusta all'interno SearchView), ma non è a prova di proiettile. Soprattutto se qualche produttore decide di reimplementare gli interni SearchViewe l'elemento con l'ID sopra menzionato non è presente, il codice non funzionerà.

In SDK, lo sfondo del campo di testo in SearchViewè dichiarato tramite nove patch , quindi lo faremo allo stesso modo. Puoi trovare immagini png originali nella directory drawable-mdpi del repository git di Android . Ci interessano due immagini. Uno per lo stato in cui il campo di testo è selezionato (denominato textfield_search_selected_holo_light.9.png ) e uno per dove non lo è (denominato textfield_search_default_holo_light.9.png ).

Sfortunatamente, dovrai creare copie locali di entrambe le immagini, anche se desideri personalizzare solo lo stato focalizzato . Questo perché textfield_search_default_holo_lightnon è presente in R.drawable . Pertanto non è facilmente accessibile tramite @android:drawable/textfield_search_default_holo_light, che potrebbe essere utilizzato nel selettore mostrato di seguito, invece di fare riferimento al drawable locale.

NOTA: stavo usando il tema Holo Light come base, ma puoi fare lo stesso con Holo Dark . Sembra che non ci sia alcuna reale differenza nelle 9 patch di stato selezionate tra i temi Chiaro e Scuro . Tuttavia, c'è una differenza in 9 patch per lo stato predefinito (vedi Chiaro vs Scuro ). Quindi, probabilmente non è necessario creare copie locali di 9 patch per lo stato selezionato , sia per i temi Dark che per quelli Light (supponendo che tu voglia gestirli entrambi e farli sembrare entrambi uguali a Holo Theme ). Basta fare una copia locale e usarla in formatoselettore disegnabile per entrambi i temi.

Ora, dovrai modificare le nove patch scaricate secondo le tue necessità (cioè cambiare il colore blu in rosso). Puoi dare un'occhiata al file usando lo strumento Draw 9-patch per verificare se è definito correttamente dopo la tua modifica.

Ho modificato i file usando GIMP con lo strumento matita da un pixel (abbastanza facile) ma probabilmente userete lo strumento da soli. Ecco la mia patch 9 personalizzata per lo stato focalizzato :

inserisci qui la descrizione dell'immagine

NOTA: per semplicità, ho utilizzato solo immagini per la densità mdpi . Dovrai creare 9 patch per più densità dello schermo se desideri il miglior risultato su qualsiasi dispositivo. Le immagini per Holo SearchView possono essere trovate in mdpi , hdpi e xhdpi disegnabili.

Ora, dobbiamo creare un selettore disegnabile, in modo che l'immagine corretta venga visualizzata in base allo stato di visualizzazione. Crea file res/drawable/texfield_searchview_holo_light.xmlcon il seguente contenuto:

<?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>

Useremo il disegnabile creato sopra per impostare lo sfondo per la LinearLayoutvista che contiene il campo di testo all'interno SearchView- il suo ID è android:id/search_plate. Quindi, ecco come farlo rapidamente nel codice, durante la creazione del menu delle opzioni:

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);
    }

}

Effetto finale

Ecco lo screenshot del risultato finale:

inserisci qui la descrizione dell'immagine

Come ci sono arrivato

Penso che valga la pena conoscere come sono arrivato a questo, in modo che questo approccio possa essere utilizzato quando si personalizzano altre visualizzazioni.

Verifica del layout di visualizzazione

Ho controllato l' SearchViewaspetto del layout. Nel costruttore di SearchView si può trovare una linea che gonfia il layout:

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

Ora sappiamo che il SearchViewlayout è nel file denominato res/layout/search_view.xml. Esaminando search_view.xml possiamo trovare un LinearLayoutelemento interno (con id search_plate) che ha android.widget.SearchView$SearchAutoCompleteal suo interno (sembra il nostro campo di testo della vista di ricerca):

    <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">

Ora, ora che lo sfondo è impostato in base searchViewTextFieldall'attributo del tema corrente .

Attributo investigativo (è facilmente impostabile?)

Per verificare come searchViewTextFieldè impostato l'attributo, esaminiamo res / values ​​/ themes.xml . C'è un gruppo di attributi correlati a SearchViewin impostazione predefinita 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>

Vediamo che per il tema predefinito il valore è @drawable/textfield_searchview_holo_dark. Anche il Theme.Lightvalore è impostato in quel file .

Ora, sarebbe fantastico se questo attributo fosse accessibile tramite R.styleable , ma sfortunatamente non lo è. Per fare un confronto, Altri tema attributi che sono presenti sia in themes.xml e R.attr come textAppearance o selectableItemBackground . Se searchViewTextFieldfosse presente in R.attr(e R.stylable) potremmo semplicemente usare il nostro selettore disegnabile quando definiamo il tema per l'intera nostra applicazione in XML. Per esempio:

<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>

Cosa dovrebbe essere modificato?

Ora sappiamo che dovremo accedere search_platetramite codice. Tuttavia, non sappiamo ancora come dovrebbe essere. In breve, cerchiamo i drawable usati come valori nei temi predefiniti: textfield_searchview_holo_dark.xml e textfield_searchview_holo_light.xml . Guardando il contenuto vediamo che il drawable fa selectorriferimento ad altri due drawable (che successivamente saranno 9 patch) in base allo stato di visualizzazione. Puoi trovare 9 patch estraibili aggregate da (quasi) tutte le versioni di Android su androiddrawables.com

Personalizzazione

Riconosciamo la linea blu in una delle 9 patch , quindi ne creiamo una copia locale e cambiamo i colori come desiderato.


Il tuo codice java non funzionerà, il suo SearchView è nella ActionBar e non può essere trovato con il metodo findViewById. Ma il resto è corretto!
VinceFR

@VinceFR Grazie per averlo fatto notare. Non l'ho notato (mi sono concentrato su SearchViewse stesso). Va bene se unisco la tua risposta (sovrascrivendo onCreateOptionsMenu) nella mia?
vArDo

@VinceFR Ho spostato il mio codice da onCreate()metodo a onCreateOptionsMenu()metodo come suggerito. Ha votato la tua risposta.
vArDo

Grazie mille: D esiste un modo per cambiare l'icona Mag e l'icona Chiudi in modo simile?
Harsha MV

Come possiamo cambiare l'icona di una lente d'ingrandimento? Provo tutto, ma non posso cambiarlo ... Grazie ... e come farlo nella barra delle azioni di Sherlock?
Jovan

31

Le soluzioni di cui sopra potrebbero non funzionare se stai usando la libreria appcompat. Potrebbe essere necessario modificare il codice per farlo funzionare per la libreria appcompat.

Ecco la soluzione funzionante per la libreria 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);
}

1
questo non funziona per search_mag_icon. Dà "Style contiene la chiave con ingresso male: 0x01010479"
Lavanya

1
la piastra di ricerca non funziona per me (fa qualcosa ma non riesco a vedere alcun cambiamento alla linea di fondo), ma l'idea generale per AppCompat è molto utile
guy_m

14

Il tuo onCreateOptionsMenumetodo deve essere:

@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);
    }

dove l'elemento di ricerca è menu_searchfuori rotta

ed ecco il searchviewredversion(questa è la versione xhdpi): http://img836.imageshack.us/img836/5964/searchviewredversion.png

inserisci qui la descrizione dell'immagine


c'è un modo per cambiare l'icona Cerca e il pulsante Chiudi in modo simile?
Harsha MV

Non conosco SherlockActionBar 4.2 Ma sì, puoi cambiare l'icona di ricerca e il pulsante di chiusura allo stesso modo!
VinceFR

ActionbarSherlock ha i propri temi e definisce il proprio SearchView. Ciò significa che puoi semplicemente aggiungere un elemento al tuo tema denominato searchViewTextField e utilizzando la definizione disegnabile e le 9 patch sopra.
NKijak

1
Non dimenticare di rinominare il file in searchviewredversion.9.png per indicare di esportare la risorsa come patch 9
1owk3y

13

La soluzione sopra non funziona con ActionBarSherlock 4.2 e quindi non è compatibile con le versioni precedenti di Android 2.x. Ecco il codice funzionante che configura lo sfondo di SearchView e il testo del suggerimento su 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));
}

dove devo mettere questo codice? Sto cercando di farlo nella versione 4.2 della barra delle azioni. la mia domanda stackoverflow.com/questions/13992424/…
Harsha MV

Ciao, chiamalo dal metodo onCreateOptionsMenu. Trova searchView e passalo a questo metodo.
David Vávra

Grazie. Qualche idea su come rimuovere quel simbolo Mag inline come mostrato qui i.imgur.com/YvBz2.png
Harsha MV

3
Con ABS estenderai Theme.Sherlock o Theme.Sherlock.Light non i temi Android. Ciò significa che tutto ciò che devi fare è aggiungere un elemento denominato searchViewTextField alla definizione del tema delle tue app. Tutto fatto in XML nessun codice richiesto.
NKijak

5

Sono stanco di fare anche questo e sto usando v7. L'applicazione si è bloccata quando ho provato ad afferrare il searchPlatetramite getIdentifier()quindi l'ho fatto in questo modo:

View searchPlate = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);

3

Ho anche affrontato lo stesso problema: ho usato la libreria appcompat v7 e ho definito uno stile personalizzato. Nella cartella disegnabile metti il ​​file bottom_border.xml che assomiglia a questo:

<?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>

Nella cartella dei valori 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>

Ho definito il file custommenu.xml per la visualizzazione del 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"/>

La tua attività dovrebbe estendere ActionBarActivity invece di Activity.

@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);
}

Nel file manifest:

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

Per ulteriori informazioni, vedere qui:
Qui http://www.jayway.com/2014/06/02/android-theming-the-actionbar/


Partenza: stackoverflow.com/questions/8211929/... per un altro esempio lista dei livelli.
Jared Burrows

3

Aggiornare

Se stai usando AndroidX, puoi farlo in questo modo

    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);
        }
    }

2

Per prima cosa, creiamo un file XML chiamato search_widget_background.xml, da usare come disegnabile, cioè sotto la directory disegnabile.

<?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>

Questo disegnabile verrà utilizzato come sfondo per il nostro widget di ricerca. Ho impostato il colore sul rosso perché è quello che hai chiesto, ma puoi impostarlo su qualsiasi colore definito dal tag @color. Puoi anche modificarlo ulteriormente utilizzando gli attributi definiti per il tag shape (fai angoli arrotondati, fai uno sfondo ovale, ecc.).

Il prossimo passo è impostare lo sfondo del nostro widget di ricerca su questo. Questo può essere ottenuto come segue:

    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);
...
    }

@shkschneider IMHO non funzionerà, perché lo sfondo deve essere impostato su un elemento all'interno SearchView(denominato search_plate), non su SearchViewse stesso. Vedi la mia risposta per maggiori dettagli. Tuttavia, devo ammettere, non ho provato a usare la risposta di @ (baba tenor).
vArDo

Non ho notato che SearchView era in ActionBar. Ora dovrebbe funzionare.
Erol

@babatenor Questo non funzionerà perché lo sfondo per SearchViewse stesso sarà sempre sotto lo sfondo per gli elementi che si trovano all'interno SearchView. C'è una LinearLayoutvista all'interno SearchViewche ha id search_plate, che ha questo elemento di sottolineatura blu come sfondo. Vedi la mia risposta per i dettagli. Quindi con la tua soluzione il risultato è uno sfondo blu per l'intero widget con la sottolineatura blu ancora visibile. Ho provato su Jelly Bean , ma non credo che la versione target dell'SDK sia importante qui.
vArDo

Grazie vArDo. Conoscevo la struttura a strati di SearchView, ma pensavo che avrebbe funzionato (almeno a me sembrava logico).
Erol

1
@babatenor Sarebbe fantastico se funzionasse, in modo che tutto questo hackery non sia necessario :)
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 );
........
    }

e questo è il file 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>


0

Se stai gonfiando Searchview in questo modo "getMenuInflater (). Inflate (R.menu.search_menu, menu);". Quindi puoi personalizzare questa visualizzazione di ricerca tramite style.xml come di seguito.

<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>

0

Ci stavo scavando molto e finalmente ho trovato questa soluzione e per me funziona!
Puoi usarlo

Se usi appcompat prova questo:

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

Se usi androidx prova questo:

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

Cambierà l'icona predefinita di serchview.

Spero che sia d'aiuto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.