Android toolbar的灵活性很高,因为它本身就是一个ViewGroup,所以可以通过添加自定义view的形式自行设置标题的样式,这样既不就能满足大部分需求了。
本次主要说一下使用SearchView的时候,如何自定义它的样式。
网上大部分都是通过获取SearchView里的控件如EditText来修改它的样式,主要代码如下:
SearchView searchView = (SearchView) findViewById(R.id.search);
int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(getResources().getColor(R.color.black6));
textView.setHintTextColor(getResources().getColor(R.color.lightgrey));
这个方法简单粗暴(本人并未实践),但是个人感觉有点麻烦且不够优雅。如果很多页面需要用到的话search的话都需要添加这么一段代码,比较繁琐。那有没有一个一劳永逸的方法呢?答案是肯定的!
其实我们可以通过设置style的方式来进行简单的修改。
<style name="Widget.SearchView" parent="Widget.AppCompat.SearchView">
<item name="defaultQueryHint">请输入关键字</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="searchIcon">@drawable/abc_ic_search_api_mtrl_alpha</item>
<item name="searchHintIcon">@drawable/abc_ic_search_api_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>
</style>
通过这个style可以设置searchview的默认hint,EditText的背景和一些icon等等。然后在APP的Theme中添加<item name="searchViewStyle">@style/Widget.SearchView</item>
。
但是现在textview的字体颜色还无法定义。可以在APP的Theme中添加如下属性设置:
<!--searchview 文字及图标颜色-->
<item name="android:textColorPrimary">@color/textColorPrimary</item>
<item name="android:textColorHint">@android:color/white</item>
以上基本就能统一设置searchview的样式了。因为一些属性比如android:textColorPrimary在设置过程中可能和别的页面中样式存在冲突,这个就需要自己考量了,不过一般在activity中各个EditText或者Textview还是自定义颜色比较好而且也方便,所以应该不存在大问题。
另:Toolbar中如果设置溢出图标样式?
这里只说个简单的,Android系统默认提供两种样式分别适配Light和Dark主题,这里只能是在Dark中使用Light样式的图标,或者Light中使用Dark图标,如果超过这两种就得自己定义了。
方法是添加如下属性到自己的Theme中
<!--toobar 溢出图标颜色-->
<item name="android:textColorSecondary">@android:color/white</item>