2013-08-15 14 views
19

Qualcuno sa come modificare il colore del testo dell'app SearchView? Ho trascorso 2 ore e ho provato diversi suggerimenti da SO e nessuno funziona.Modifica testo e colore suggerimento SearchView di AppCompat

Qui è il mio codice:

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

    <item 
     android:id="@+id/layer_switcher_button" 
     android:icon="@drawable/b_categorias" 
     android:title="@string/menu_layer_switcher_title" 
     espacios:showAsAction="ifRoom|collapseActionView"/> 
    <item 
     android:id="@+id/action_search" 
     android:icon="@drawable/b_buscar" 
     android:title="@string/menu_search_title" 
     espacios:actionViewClass="android.support.v7.widget.SearchView" 
     espacios:showAsAction="ifRoom|collapseActionView"/> 

</menu> 

E nella mia attività ho questo:

public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 

    menuItem layerSwitcher = menu.findItem(R.id.layer_switcher_button); 
    layerSwitcher.setOnMenuItemClickListener(new OnMenuItemClickListener() { 

     @Override 
     public boolean onMenuItemClick(MenuItem item) { 
     onLayerSwitcherButtonClicked(); 
      return false; 
     } 
    }); 

    MenuItem searchItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 

    LinearLayout ll = (LinearLayout) searchView.getChildAt(0); 
    TextView textView = (TextView) ll.getChildAt(0); 

    textView.setTextColor(R.color.white); 
} 
+0

Hai provato utilizzando SearchableInfo? –

risposta

41
SearchView searchView = new SearchView(getContext()); 
SearchView.SearchAutoComplete theTextArea = (SearchView.SearchAutoComplete)searchView.findViewById(R.id.search_src_text); 
theTextArea.setTextColor(Color.WHITE);//or any color that you want 
+4

L'uso di 'android.support.v7.appcompat.R.id.search_src_text' funziona piuttosto che usare' R.id.search_src_text': http://stackoverflow.com/a/18813109/950427 –

+1

@Jared Burrows la tua aggiunta è stata utile! –

7

Un oggetto SearchView si estende da LinearLayout, in modo che detiene altre viste. Il trucco è trovare la vista tenendo premuto il testo suggerimento e cambiare il colore a livello di programmazione. Percorrendo la gerarchia vista, è possibile trovare il widget contenente il testo suggerimento:

// get your SearchView with its id 
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
// traverse the view to the widget containing the hint text 
LinearLayout ll = (LinearLayout)searchView.getChildAt(0); 
LinearLayout ll2 = (LinearLayout)ll.getChildAt(2); 
LinearLayout ll3 = (LinearLayout)ll2.getChildAt(1); 
SearchView.SearchAutoComplete autoComplete = (SearchView.SearchAutoComplete)ll3.getChildAt(0); 
// set the hint text color 
autoComplete.setHintTextColor(getResources().getColor(Color.WHITE)); 
// set the text color 
autoComplete.setTextColor(Color.BLUE); 

Questo metodo funziona con qualsiasi tema. Inoltre, è possibile modificare l'aspetto di altri widget nella gerarchia SearchView, ad esempio EditText contenente la query di ricerca.

+0

hey JfCartier, si spera che tu possa rispondere, il fatto è che l'ultimo figlio che sta ottenendo (completamento automatico ..) viene visualizzato come un .... SearchView $ SearchAutoComplete type ... che non può essere convertito in normale ... SearchView. SearchAutoComplete ... (cosa significano quei simboli del dollaro? –

+0

Il simbolo del dollaro significa che si tratta di una classe interna, quindi è davvero SearchView.SearchAutoComplete. Che errore stai ottenendo? – jfcartier

+0

beh, semplicemente non eseguirà il cast di un completamento automatico della ricerca .. impossibile per trasmettere etc ...! come se fosse un altro oggetto! –

3

È possibile personalizzare searchview utilizzando la libreria di appcompat v7. Ho utilizzato la libreria di appcompat v7 e definito lo stile personalizzato per esso. In cartella drawable messo bottom_border.xml di file 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> 

In valori cartella 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 di file custommenu.xml per il menu di visualizzazione:

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

L'attività dovrebbe estendere ActionBarActivity anziché Activity. Ecco il metodo onCreateOptionsMenu.

@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 manifesto:

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

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

+0

Modificare il searchViewTextField non ha funzionato per me –

0

Cambia stile di SearchView in AppCompat v21

1) Creazione di una configurazione seachable file. Questo file è tradizionalmente denominato searchable.xml e deve essere salvato nella directory res/xml/project.

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:label="@string/app_label" 
    android:hint="@string/search_hint" > 
</searchable> 

2) Aggiungere metadati e attribuire alla vostra attività e di azione per intent-filtro AndroidManifest.xml

<activity 
     android:name=".activity.YourActivity" 
     android:screenOrientation="portrait" 
     android:theme="@style/Theme.App.Base"> 
     <meta-data android:name="android.app.searchable" 
        android:resource="@xml/searchable"/> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 
    </activity> 

3) Creazione di stili per indicatori, icone, suggerimento e colori del testo.

<style name="ActionBarThemeOverlay" parent=""> 
     <item name="android:textColorPrimary">@color/action_bar_text</item> 
     <item name="colorControlNormal">@color/action_bar_text</item> 
     <item name="colorControlHighlight">@color/body_text_2</item> 
    </style> 

<style name="Widget.App.SearchView" parent="Widget.AppCompat.Light.SearchView"> 
    <item name="closeIcon">@drawable/ic_action_cancel</item> 
    <item name="voiceIcon">@drawable/ic_action_voice</item> 
</style> 

4) Aggiungi Widget.App.Cerca per BaseAppTheme aggiunto AndroidManifest come lo stile di attività

<style name="Theme.App.Base" parent="Theme"> 
    name="searchViewStyle">@style/Widget.App.SearchView</item> 
</style> 

Aggiungi ActionBarThemeOverlay alla barra degli strumenti inizializzazione del

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar_actionbar" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/toolbar_height" 
    android:background="@color/color_primary" 
    app:theme="@style/ActionBarThemeOverlay" 
    app:popupTheme="@style/ActionBarPopupThemeOverlay" 
    app:subtitleTextAppearance="@style/Theme.ActionBar.SubtitleTextStyle" 
    app:titleTextAppearance="@style/Theme.ActionBar.TitleTextStyle"/> 
+0

Questo è un modo fantastico per ottenere il tema SearchView. Basta creare uno stile e applicarlo alla barra degli strumenti! Ha funzionato come un fascino! – sud007

5

Nessuna delle risposte ha lavorato per me. Ciò che alla fine ha funzionato è stato l'impostazione di un tema sulla barra degli strumenti e la specifica di textColorHint.

Theme (in styles.xml):

<style name="ToolbarTheme"> 
    <item name="android:textColorHint">@color/white_opacity_60</item> 
</style> 

Toolbar (in qualsiasi layout):

<android.support.v7.widget.Toolbar 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/ToolbarTheme" /> 

Questo funziona perché una quando si imposta un tema a un ViewGroup, i suoi attributi vengono applicati anche a tutte le viste figlio del ViewGroup. Questa è una delle differenze tra un tema e uno stile :)

0

un'altra soluzione:

searchView_SA = (SearchView) findViewById(R.id.searcvViewSA); 
EditText searchEditText = (EditText)searchView_SA.findViewById(android.support.v7.appcompat.R.id.search_src_text); 
    searchEditText.setTextColor(getResources().getColor(R.color.black)); 
    searchEditText.setHintTextColor(getResources().getColor(R.color.black)); 
Problemi correlati