在Android的SearchView中,是否可以更改文本颜色?

144

SearchView元素没有更改文本颜色的任何属性。默认文本颜色是黑色,不适用于我们的深色背景。有没有一种方法可以更改文本颜色,而不必诉诸hack?

我发现了一个类似的问题,与更改文本大小有关,但到目前为止,它还没有任何答案:如何设置SearchView TextSize?


请提及您尝试过的内容。 - Sahil Mahajan Mj
是的,这是可能的。看看这个链接:https://dev59.com/hGMl5IYBdhLWcg3woYEu#66246372 - KennyAli
38个回答

143

添加

<item name="android:editTextColor">@android:color/white</item>

修改父主题文件可以更改输入的文本。您也可以使用

<item name="android:textColorHint">@android:color/white</item>

更改SearchView中提示文本的颜色。(请注意,您可以将@android:color/white替换为任何适当的值)


1
这对我很有帮助,而且没有涉及使用反射的任何复杂花招。也适用于appcompat。 - dj_bushido
您还可以在SearchView上设置android:theme属性为具有android:editTextColor元素的样式。这样,只会影响该SearchView。 - Pepijn
2
它可以工作!我在工具栏中使用了一个搜索视图,扩展了ThemeOverlay.AppCompat.Light并添加了上述项目,并在Toolbar小部件上设置了样式;)像魅力一样运作... - codename_47
这个解决方案对我无效。文本仍然是错误的颜色。下面的答案通过编程设置提示颜色对我起作用了。 - Dominik
10
这个答案的问题在于它会改变你的 EditText 的文本颜色。目前为止唯一一个能够仅改变 SearchView 文本颜色并且对我有用的解决方案在这里:https://dev59.com/eFoU5IYBdhLWcg3wvIqp#40550067。 - ban-geoengineering
显示剩余6条评论

105
尝试这样做: 您可以从SDK获取TextView的句柄,然后更改它,因为它们不会公开它。
int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);

30
这个总是返回null。 - danielrvt-sgb
请注意,如果您正在使用ActionBarSherlock,则视图ID将不同。例如,该库当前将编辑文本ID设置为“package:id / abs__search_src_text”,可以通过R.id.abs__search_src_text直接访问。 - greg7gkb
3
另外,我实际想要更改的是SearchView提示文本颜色,这可以通过textView.setHintTextColor()轻松完成。 - greg7gkb
3
这是一个非常粗糙的处理方式。像akdotcom建议的那样,使用android:editTextColor和android:textColorHint来代替。 - Philipp Hofmann
1
对于 AndroidX,您需要使用 searchView.findViewById<TextView>(androidx.appcompat.R.id.search_src_text) 来查找 TextView。 - René Jörg Spies

75

这对我有效。

SearchView searchView = (SearchView) findViewById(R.id.search);
EditText searchEditText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchEditText.setTextColor(getResources().getColor(R.color.white));
searchEditText.setHintTextColor(getResources().getColor(R.color.white));

1
如果您将视图作为TextView或者AutoCompleteTextView获取,这也是有效的。 - Juan José Melero Gómez
是的,在遵循 @JuanJoséMeleroGómez 的建议后,这对我来说是一项工作。 - Parth Patel
我猜这是从我的答案这里复制并缩短的:https://dev59.com/gmgu5IYBdhLWcg3wbWo9#26251197。 - CoolMind

36
感谢@CzarMatt,我添加了AndroidX支持。
对我来说以下的方法可行。我使用了一个链接中的代码:Change text color of search hint in actionbar using support library
    searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

    EditText txtSearch = ((EditText)searchView.findViewById(androidx.appcompat.R.id.search_src_text));
    txtSearch.setHint(getResources().getString(R.string.search_hint));
    txtSearch.setHintTextColor(Color.LTGRAY);
    txtSearch.setTextColor(Color.WHITE);

改变操作栏搜索视图提示文本颜色给出了另一个解决方案。它可以工作,但仅设置提示文本和颜色。

    searchView.setQueryHint(Html.fromHtml("<font color = #ffffff>" + getResources().getString(R.string.search_hint) + "</font>"));

4
如果您已将项目迁移到AndroidX,请使用androidx.appcompat.R.id.search_src_text - CzarMatt

27

我想做类似的事情。最终我不得不在SearchView的子项中找到TextView:

for (TextView textView : findChildrenByClass(searchView, TextView.class)) {
    textView.setTextColor(Color.WHITE);
}

如果您需要util方法:

public static <V extends View> Collection<V> findChildrenByClass(ViewGroup viewGroup, Class<V> clazz) {

    return gatherChildrenByClass(viewGroup, clazz, new ArrayList<V>());
}

private static <V extends View> Collection<V> gatherChildrenByClass(ViewGroup viewGroup, Class<V> clazz, Collection<V> childrenFound) {

    for (int i = 0; i < viewGroup.getChildCount(); i++)
    {
        final View child = viewGroup.getChildAt(i);
        if (clazz.isAssignableFrom(child.getClass())) {
            childrenFound.add((V)child);
        }
        if (child instanceof ViewGroup) {
            gatherChildrenByClass((ViewGroup) child, clazz, childrenFound);
        }
    }

    return childrenFound;
}

3
之前的解决方案也出现了 null 异常,但这个解决方案对我很有用! - Diego Ponciano
1
这应该被标记为已接受的答案。上面那个返回 null。感谢你的好工作,伙计 :) - blueware
3
这个解决方案很令人不爽,但它是唯一真正有效的方法,责任在于Android团队! - Ofek Ron
我们如何使用这个来访问搜索图标? - Yasin Yaqoobi
太棒了!这是有史以来最好的解决方案……所有这些XML设计都是…… - Stav Bodik

17

您可以在View中使用android:theme属性来覆盖默认颜色。

如果您正在使用ToolbarMaterialToolbar

<com.google.android.material.appbar.MaterialToolbar
    android:theme="@style/ThemeOverlay.Toobar"
    ...>
或者:
<androidx.appcompat.widget.Toolbar
    android:theme="@style/ThemeOverlay.Toobar"
    ...>

当主题与Material组件主题叠加时:

<style name="ThemeOverlay.Toobar" parent="ThemeOverlay.MaterialComponents.Toolbar.Primary">
    <!-- Text color -->
    <item name="android:editTextColor">@color/....</item>
    <!-- Hint text color -->
    <item name="android:textColorHint">@color/...</item>
</style>

使用AppCompat主题:

<style name="ThemeOverlay.Toobar" parent="ThemeOverlay.AppCompat.Light.*">
    <!-- Text color -->
    <item name="android:editTextColor">@color/....</item>
    <!-- Hint text color -->
    <item name="android:textColorHint">@color/...</item>
</style>

enter image description here


如果你在你的布局中使用了一个 SearchView,你可以做类似的事情:

   <androidx.appcompat.widget.SearchView
       android:theme="@style/ThemeOverlay.SearchView"

   <style name="ThemeOverlay.SearchView" parent="">
        <!-- Text color -->
        <item name="android:editTextColor">@color/...</item>
        <!-- Hint text color -->
        <item name="android:textColorHint">@color/...</item>
    </style>

在这里输入图片描述


16
您可以通过在样式中设置 editTextColor 属性来实现。
<style name="SearchViewStyle" parent="Some.Relevant.Parent">
    <item name="android:editTextColor">@color/some_color</item>
</style>

然后你可以将这个样式应用到布局中的 ToolbarSearchView

<android.support.v7.widget.Toolbar
    android:theme="@style/SearchViewStyle">

    <android.support.v7.widget.SearchView />

</android.support.v7.widget.Toolbar>

+1 这比所有涉及 findViewById 的解决方案都要好,我认为应尽可能使用视图样式。 - Mattias
这应该是被接受的答案!非常干净和简单。 - MSeiz5

16

通过自定义样式可以最好地实现这一点。使用自己的自定义样式重载操作栏小部件样式。对于深色操作栏的 Holo Light 主题,请将以下代码放在您自己的样式文件(如 res/values/styles_mytheme.xml)中:

<style name="Theme.MyTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarWidgetTheme">@style/Theme.MyTheme.Widget</item>
    <!-- your other custom styles -->
</style>

<style name="Theme.MyTheme.Widget" parent="@android:style/Theme.Holo">
    <item name="android:textColorHint">@android:color/white</item>
    <!-- your other custom widget styles -->
</style>

请确保您的应用程序使用如链接所述的自定义主题。


9

如果您使用的是 - android.support.v7.widget.SearchView

SearchView searchView = (SearchView) item.getActionView();
EditText editText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
editText.setTextColor(Color.WHITE);

在 Kotlin 中
val searchView = SearchView(this)
val editText = searchView.findViewById<EditText>(androidx.appcompat.R.id.search_src_text)
editText.setTextColor(Color.WHITE)

现在你应该开始使用androidx支持库。


8
创建一个适用于你的工具栏的样式。
<style name="AppTheme.Toolbar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="android:editTextColor">@color/some_color</item>
</style>

将其设置为工具栏的主题。

<android.support.v7.widget.Toolbar
    android:theme="@style/AppTheme.Toolbar"
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接