【问题标题】:Change TextColor in SearchView using Android Toolbar使用 Android 工具栏更改 SearchView 中的 TextColor
【发布时间】:2015-01-25 05:24:36
【问题描述】:

我有以下问题。我已经将我的操作栏设置为使用工具栏,而不是使用 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 是一个纯白色的矩形。那你猜怎么着?由于 Toolbar 中的标题文本颜色为白色,现在 SearchView 中的文本颜色也为白色,并且由于 SearchView 背景是白色矩形,用户看不到他在输入什么。

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

【问题讨论】:

    标签: android searchview android-toolbar


    【解决方案1】:

    经过一番研究,我找到了一种安全的方法。

    在 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 Toolbar 中为 Title 文本颜色定义的颜色相同。

    现在有几种解决方案可能会起作用here,但我认为这些解决方案中的大多数都有相同的问题。它们都依赖于 TextView 的 id 来访问视图并更改文本颜色,如 here

    所述

    我个人认为在代码中硬编码 TextView 的 id 风险很大,因为我们不知道明天谷歌是否会决定为这个视图使用另一个 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 相关的所有内容。

    【讨论】:

    • 如果您使用工具栏,请将其添加到您的工具栏主题 @android:color/white。它
    【解决方案2】:

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

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

    然后你可以获取默认布局文件,你可以通过名称找到:abc_search_view.xml,供搜索视图使用并修改它。

    【讨论】:

    • abc_search_view.xml 的内容是什么
    【解决方案3】:

    这可以使用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>
    

    【讨论】:

      【解决方案4】:

      只需更改或添加android:textcolorPrimary 到您的样式,在某些情况下您的所有样式。您为此项目选择的颜色将是您的 searchview 文本的颜色。

      【讨论】: