2012-03-19 83 views

回答

17

我發現唯一一種方法來做到這一點 - 使用反射。

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

太棒了!我甚至不知道這樣的事情是可能的在java中:)謝謝Histler – pjanecze 2012-04-03 08:50:14

+0

對於其他誰是好奇的ImageView,顯示在ActionBar上,當SearchView被摺疊時,是「mSearchButton」... – 2012-05-23 21:56:33

+0

SearchView.class.getDeclaredField (「mSearchButton」)返回allways null ...任何想法? – Anthea 2012-09-15 11:49:21

-1

在ActionBarSherlock:

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

在霍洛:

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

這在Holo中不起作用。 'android:searchViewSearchIcon'不公開 – 2013-10-25 20:12:13

1

如果您正在使用Android原生搜索查看,並要更改較小的搜索圖標,當搜索查看擴展出現,那麼你有麻煩了。因爲屬性searchViewSearchIcon是內部的,並且不能使用樣式進行修改。從SearchView類

代碼片段:

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

如果使用程序兼容性V7,還有一個辦法做到這一點,而無需使用反射:

聲明如下樣式,自定義只需要這些屬性自定義,刪除其餘的(所以他們從父樣式inerhited):現在

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

,在你的主題,使用相同的屬性:

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

當然,你的主題必須從程序兼容性主題的一個繼承,在我的情況,它是這樣的:

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

而且你的活動應該擴展ActionBarActivity並使用「支持」操作欄方法的版本。 More info here

我也看到一個人的一篇文章,宣佈一些其他方式的風格,而且還使用程序兼容性V7: http://www.jayway.com/2014/06/02/android-theming-the-actionbar/