2012-03-19 14 views

risposta

17

Ho trovato l'unico modo per farlo: usare i riflessi.

SearchView mSearchView = (SearchView)menu.findItem(R.id.search).getActionView(); 
    try 
    { 
     Field searchField = SearchView.class.getDeclaredField("mSearchButton"); 
     searchField.setAccessible(true); 
     ImageView searchBtn = (ImageView)searchField.get(mSearchView); 
     searchBtn.setImageResource(R.drawable.search_img); 
     searchField = SearchView.class.getDeclaredField("mSearchPlate"); 
     searchField.setAccessible(true); 
     LinearLayout searchPlate = (LinearLayout)searchField.get(mSearchView); 
     ((ImageView)searchPlate.getChildAt(0)).setImageResource(R.drawable.search_img); 
     searchPlate.setBackgroundResource(R.drawable.edit_text_bkg); 
    } 
    catch (NoSuchFieldException e) 
    { 
     Log.e(TAG,e.getMessage(),e); 
    } 
    catch (IllegalAccessException e) 
    { 
     Log.e(TAG,e.getMessage(),e); 
    } 
+0

Fantastico! Non sapevo nemmeno che cose del genere siano possibili in java :) grazie a Histler – pjanecze

+0

Per gli altri che sono curiosi di ImageView che appaiono su ActionBar quando SearchView è compresso è il "mSearchButton" ... –

+0

SearchView.class.getDeclaredField ("mSearchButton") restituisce sempre null ... qualche idea? – Anthea

-1

In ActionBarSherlock:

<style name="Your_Theme" parent="@style/Theme.Sherlock"> 
    <item name="searchViewSearchIcon"> @drawable/ic_menu_search </item> 
</style> 

In Holo:

<style name="Your_Theme" parent="@style/Theme.Light"> 
    <item name="android:searchViewSearchIcon"> @drawable/ic_search </item> 
</style> 
+1

Questo non funziona in Holo. 'android: searchViewSearchIcon' non è accessibile al pubblico –

1

Se si utilizza Android SearchView nativa e si desidera modificare piccola icona di ricerca, che appare quando SearchView è espanso, allora sei nei guai. Poiché l'attributo searchViewSearchIcon è interno e non può essere modificato utilizzando gli stili.

Codice frammento dalla classe SearchView:

private int getSearchIconId() { 
    TypedValue outValue = new TypedValue(); 
    getContext().getTheme().resolveAttribute(com.android.internal.R.attr.searchViewSearchIcon, 
      outValue, true); 
    return outValue.resourceId; 
} 
3

Se si utilizza AppCompat v7, c'è un modo per farlo senza l'utilizzo di riflessione:

Dichiarare il seguente stile, e personalizzare solo le proprietà necessari per personalizzare, rimuovere il resto (in modo che siano inerhited dalla stile principale):

<style name="Widget.AppCompat.SearchView.CustomSearchView" parent="@style/Widget.AppCompat.SearchView"> 
    <item name="layout">@layout/abc_search_view</item> 
    <item name="queryBackground">@drawable/abc_textfield_search_material</item> 
    <item name="submitBackground">@drawable/abc_textfield_search_material</item> 
    <item name="closeIcon">@drawable/abc_ic_clear_mtrl_alpha</item> 
    <item name="goIcon">@drawable/abc_ic_go_search_api_mtrl_alpha</item> 
    <item name="voiceIcon">@drawable/abc_ic_voice_search_api_mtrl_alpha</item> 
    <item name="commitIcon">@drawable/abc_ic_commit_search_api_mtrl_alpha</item> 
    <item name="suggestionRowLayout">@layout/abc_search_dropdown_item_icons_2line</item> 
    <item name="searchIcon">@drawable/ic_action_search</item> 
</style> 

Ora, nel tema, utilizzare la stessa proprietà:

<item name="searchViewStyle">@style/Widget.AppCompat.SearchView.Bonial</item> 

Naturalmente, il tema deve ereditare da uno dei temi AppCompat, nel mio caso, è stato qualcosa di simile:

<style name="Theme.MyActionBarActivity" parent="@style/Theme.AppCompat.Light"> 

anche le vostre attività dovrebbero estendersi ActionBarActivity e utilizzare il "supporto" versione dei metodi della barra delle azioni. More info here.

ho anche letto un articolo di un ragazzo che ha dichiarato gli stili in qualche altro modo, ma anche utilizzando AppCompat v7: http://www.jayway.com/2014/06/02/android-theming-the-actionbar/