2012-03-19 4 views

Répondre

17

J'ai trouvé la seule façon de le faire - utiliser des réflexions.

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

Fantastique! Je ne savais même pas que de telles choses sont possibles en java :) merci Histler – pjanecze

+0

Pour les autres qui sont curieux le ImageView qui apparaît sur l'ActionBar lorsque le SearchView est réduit est le "mSearchButton" ... –

+0

SearchView.class.getDeclaredField ("mSearchButton") retourne toujours null ... une idée? – Anthea

-1

En ActionBarSherlock:

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

En Holo:

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

Cela ne fonctionne pas dans Holo. 'android: searchViewSearchIcon' n'est pas accessible au public –

1

Si vous utilisez SearchView natif Android et que vous voulez changer petite icône de recherche, qui apparaît lorsque SearchView est étendu, alors vous avez des ennuis. Car l'attribut searchViewSearchIcon est interne et ne peut pas être modifié à l'aide de styles.

Extrait de code de la classe SearchView:

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

Si vous utilisez appcompat v7, il y a un moyen de le faire sans utiliser la réflexion:

Déclare le style suivant, et personnaliser uniquement les propriétés dont vous avez besoin personnaliser, enlever le reste (ils sont inerhited du style parent):

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

maintenant, dans votre thème, utilisez la même propriété:

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

Bien sûr, votre thème doit hériter de l'un des thèmes appcompat, dans mon cas, il était quelque chose comme ceci:

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

également vos activités devraient étendre ActionBarActivity et utiliser le « soutien » version des méthodes de la barre d'action. More info here.

Je lis aussi un article d'un gars qui a déclaré que les styles d'une autre manière, mais aussi en utilisant AppCompat v7: http://www.jayway.com/2014/06/02/android-theming-the-actionbar/