使用Android工具栏在SearchView中更改TextColor

我有以下问题。 我已经设置了我的操作栏来使用工具栏,而不是使用带有appcompat-v7:21的API 21。 textColorPrimary样式标签被configuration为使用颜色@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/search_background是一个纯白色的矩形。 那么猜猜怎么样? 由于工具栏中的标题文本颜色是白色,所以现在,SearchView中的文本颜色也是白色的,而且由于SearchView背景是白色的矩形,因此用户无法看到他正在键入的内容。

我的问题是:如何为Android工具栏标题和SearchView文本使用不同的文本颜色?

经过一番调查,我find了一个可靠的方法来做到这一点

挖掘SearchView样式,我发现了用于显示SearchView的布局。 在布局里面有一个TextView(你在SearchView中input的实际字段)

 <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工具栏中标题文字颜色的文字颜色相同。

现在有几个解决scheme可以在这里工作,但我认为这些解决scheme大部分都有同样的问题。 他们都依靠TextView的id来访问视图并更改文本颜色,如此处所述

就我个人而言,我认为在代码中对TextView的id进行硬编码是非常危险的,因为我们不知道明天Google是否决定为这个视图使用另一个id值,在这种情况下,我们的代码将被破坏。

出于这个原因,我创build了一个recursion的方法来获取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 21testing了这段代码,将工具栏标题文本颜色设置为白色,并将SearchView文本颜色设置为黑色,并且完美地工作。 而且,当我们直接访问TextView对象时,我们可以改变提示,绘制,填充以及与TextView相关的所有东西。

@David_E解决scheme的工作,但还有另一种方法。 您也可以定义自定义布局:

 <style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”> <item name="layout">@layout/my_Search_view</item> </style> 

然后,您可以采用默认的布局文件,您可以通过名称查找abc_search_view.xml ,并使用search视图进行修改。

这是可能的纯粹使用ThemeOverlay XML:

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

只需更改或添加一个android:textcolorPrimary到你的样式,在某些情况下你所有的样式。 你为这个项目select的颜色将是你的searchview文本的颜色。

您需要在样式中设置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>