我有以下问题。我已将Actionbar设置为使用工具栏,而不是使用API 21和appcompat-v7:21。 textColorPrimary
样式标记配置为使用颜色@android:color/white
,因此新Android工具栏中的所有标题都将采用白色文字颜色(到目前为止一直很好)。
现在我添加了一个SearchView,并为它设置了一个自定义背景:
<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/action_bar_background</item>
<item name="colorPrimaryDark">@color/status_background</item>
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:textColorPrimary">@android:color/white</item>
<item name="searchViewStyle">@style/SearchViewStyle</item>
</style>
<style name="SearchViewStyle" parent="Widget.AppCompat.SearchView">
<item name="queryBackground">@drawable/search_background</item>
<item name="searchIcon">@drawable/icon_search</item>
</style>
drawable @drawable/search_background
是一个纯白色矩形。那猜猜怎么着?由于工具栏中的标题文本颜色为白色,因此SearchView中的文本颜色现在也是白色,而SearchView背景是白色矩形,用户无法看到他正在键入的内容。
我的问题是:如何为Android工具栏标题和SearchView文本提供不同的文字颜色?
答案 0 :(得分:24)
经过一番研究后,我发现了一种安全的方法。
在SearchView样式中,我找到了用于显示SearchView的布局。在该布局中,有一个TextView(您在SearchView中键入的实际字段)
<TextView
android:id="@+id/search_badge"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:layout_marginBottom="2dip"
android:drawablePadding="0dip"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
android:visibility="gone" />
注意字段android:textColor="?android:attr/textColorPrimary"
。这导致我最初遇到的问题,SearchView中的文本颜色与Android工具栏中为标题文本颜色定义的文本颜色相同。
现在有几个可能有效的解决方案here,但我认为大多数解决方案都有同样的问题。它们都依赖于TextView的id来访问视图并更改文本颜色,如here所述
我个人认为在代码中对TextView的id进行硬编码是非常危险的,因为我们不知道明天Google是否决定为此视图使用另一个id值,在这种情况下,我们的代码将被破坏
因此我创建了一个递归方法,在SearchView中获取TextView对象,并将颜色更改为我们想要的颜色。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
inflater.inflate(R.menu.search, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setOnQueryTextListener(new SearchTextListener());
changeSearchViewTextColor(searchView);
}
private void changeSearchViewTextColor(View view) {
if (view != null) {
if (view instanceof TextView) {
((TextView) view).setTextColor(Color.BLACK);
return;
} else if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
changeSearchViewTextColor(viewGroup.getChildAt(i));
}
}
}
}
我已经使用API 21使用工具栏测试了此代码,将工具栏标题文本颜色设置为白色,并将SearchView文本颜色设置为黑色,并且工作正常。此外,当我们直接访问TextView对象时,我们可以更改提示,可绘制,填充以及与TextView相关的所有内容。
答案 1 :(得分:3)
使用ThemeOverlay
:
<style name="ThemeOverlay.MyApp.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar">
<item name="autoCompleteTextViewStyle">@style/Widget.MyApp.AutoCompleteTextView.SearchView</item>
<item name="searchViewStyle">@style/Widget.MyApp.SearchView</item>
</style>
<style name="Widget.MyApp.AutoCompleteTextView.SearchView" parent="Widget.AppCompat.AutoCompleteTextView">
<item name="android:textColor">#000</item>
<item name="android:textColorHint">#5000</item>
</style>
<style name="Widget.MyApp.SearchView" parent="Widget.AppCompat.SearchView">
<item name="queryBackground">@drawable/search_background</item>
<item name="searchIcon">@drawable/icon_search</item>
</style>
然后在你的布局文件中:
<android.support.v7.widget.Toolbar
app:theme="@style/ThemeOverlay.MyApp.ActionBar"
... />
如果您还希望将其应用于使用ActionBar
而不是ToolBar
的活动,则可以将其添加到Activity
的主题中:
<style name="Theme.MyApp" parent="Theme.AppCompat">
<item name="actionBarTheme">@style/ThemeOverlay.MyApp.ActionBar</item>
...
</style>
答案 2 :(得分:2)
@David_E的解决方案有效,但还有另一种方法。您还可以定义自定义布局:
<style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”>
<item name="layout">@layout/my_Search_view</item>
</style>
然后您可以使用默认布局文件,您可以通过名称找到它:abc_search_view.xml
,由搜索视图使用并修改它。
答案 3 :(得分:0)
在某些情况下,只需更改或添加android:textcolorPrimary
到您的样式,所有样式。您为此项目选择的Wat颜色将是searchview
文字的颜色。
答案 4 :(得分:-2)
您需要在样式中设置editTextColor
属性以通过XML更改它。
<style name="SearchViewStyle" parent="Widget.AppCompat.SearchView">
<item name="android:editTextColor">@color/some_color</item>
</style>
并将此样式应用于布局中的SearchView
。
<android.support.v7.widget.Toolbar>
<android.support.v7.widget.SearchView
android:theme="@style/SearchViewStyle" />
</android.support.v7.widget.Toolbar>