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

Dav*_*d_E 11 android searchview android-toolbar

我有以下问题.我已将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>
Run Code Online (Sandbox Code Playgroud)

drawable @drawable/search_background是一个纯白色矩形.那猜猜怎么着?由于工具栏中的标题文本颜色为白色,因此SearchView中的文本颜色现在也是白色,而SearchView背景是白色矩形,用户无法看到他正在键入的内容.

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

Dav*_*d_E 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" />
Run Code Online (Sandbox Code Playgroud)

注意该字段android:textColor="?android:attr/textColorPrimary".这导致我最初遇到的问题,SearchView中的文本颜色与Android工具栏中为标题文本颜色定义的文本颜色相同.

现在有几个解决方案可以在这里工作,但我认为大多数解决方案都有同样的问题.它们都依赖于TextView中的ID,以访问视图和改变文字颜色,描述在这里

就个人而言,我认为在代码中对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));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经使用API​​ 21使用工具栏测试了此代码,将工具栏标题文本颜色设置为白色,并将SearchView文本颜色设置为黑色,并且它完美地运行.此外,当我们直接访问TextView对象时,我们可以更改提示,可绘制,填充以及与TextView相关的所有内容.

  • 如果您使用工具栏将其添加到工具栏主题<item name ="android:editTextColor"> @ android:color/white </ item>.它 (2认同)

Jar*_*ard 6

这可以使用以下命令完全在 XML 中完成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>
Run Code Online (Sandbox Code Playgroud)

然后在您的布局文件中:

<android.support.v7.widget.Toolbar
    app:theme="@style/ThemeOverlay.MyApp.ActionBar"
    ... />
Run Code Online (Sandbox Code Playgroud)

如果您还希望它应用于使用 aActionBar而不是 a 的活动ToolBar,您可以将其添加到Activity的主题中:

<style name="Theme.MyApp" parent="Theme.AppCompat">
    <item name="actionBarTheme">@style/ThemeOverlay.MyApp.ActionBar</item>
    ...
</style>
Run Code Online (Sandbox Code Playgroud)