是否可以在Android SearchView上更改文本颜色?

CAC*_*lan 106 android searchview

SearchView元素没有用于更改文本颜色的任何属性.默认文本颜色为黑色,不适用于我们的深色背景.有没有办法改变文本的颜色而不诉诸黑客?

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

akd*_*com 105

<item name="android:editTextColor">@android:color/white</item>
Run Code Online (Sandbox Code Playgroud)

到父主题,这应该改变输入的文本.你也可以使用

<item name="android:textColorHint">@android:color/white</item>
Run Code Online (Sandbox Code Playgroud)

更改SearchView的提示文本.(请注意,您可以@android:color/white使用您希望使用的任何适当值替换它)

  • 有用!我在工具栏中使用了一个搜索视图,扩展了ThemeOverlay.AppCompat.Light并添加了上面的项目并在工具栏小部件上设置了样式;)就像一个魅力...... (2认同)
  • 这个答案的问题是它也会改变您的EditText的文本颜色。对我有用的唯一可单独更改SearchView文本颜色的解决方案是在这里:/sf/answers/2838504721/ (2认同)

lok*_*oko 91

尝试这样的事情:你可以从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);
Run Code Online (Sandbox Code Playgroud)

  • 这总是返回null (27认同)
  • 另外,我真正想要改变的是SearchView提示文本颜色,可以通过textView.setHintTextColor()轻松完成. (3认同)
  • 这是一个非常肮脏的黑客.使用android:editTextColor和android:textColorHint而不是像akdotcom建议的那样 (3认同)
  • 对于 AndroidX,您必须使用“searchView.findViewById&lt;TextView&gt;(androidx.appcompat.R.id.search_src_text)”来查找 TextView (2认同)

use*_*095 66

这适合我.

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));
Run Code Online (Sandbox Code Playgroud)


Fer*_*nch 24

我想做类似的事情.我终于找到TextView了其中SearchView的孩子:

for (TextView textView : findChildrenByClass(searchView, TextView.class)) {
    textView.setTextColor(Color.WHITE);
}
Run Code Online (Sandbox Code Playgroud)

如果你想要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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我也使用以前的解决方案获得null异常,这对我有用! (3认同)
  • 这个解决方案真是令人作呕,但它是唯一真正有效的解决方案,而且是Android团队的责任! (3认同)

小智 15

这最好通过自定义样式实现.使用您自己的自定义样式重载操作栏窗口小部件样式.对于带有暗动作条的全息灯,请将其放在您自己的样式文件中,例如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>
Run Code Online (Sandbox Code Playgroud)

确保您的应用程序使用主题自定义主题,如此处输入链接描述中所述


Coo*_*ind 13

对我来说,以下工作.我使用了链接中的代码:使用支持库在操作栏中更改搜索提示的文本颜色.

    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);
Run Code Online (Sandbox Code Playgroud)

更改操作栏searchview提示文本颜色建议另一种解决方案.它工作但只设置提示文字和颜色.

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

  • 如果您已将项目迁移到 AndroidX,请使用“androidx.appcompat.R.id.search_src_text”。 (3认同)

old*_*god 12

您可以通过editTextColor在样式中设置属性来完成此操作.

<style name="SearchViewStyle" parent="Some.Relevant.Parent">
    <item name="android:editTextColor">@color/some_color</item>
</style>
Run Code Online (Sandbox Code Playgroud)

并将此样式应用于ToolbarSearchView在布局中.

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

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

</android.support.v7.widget.Toolbar>
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 12

您可以使用android:theme视图中的属性覆盖默认颜色。

如果您使用的是ToolbarMaterialToolbar

<com.google.android.material.appbar.MaterialToolbar
    android:theme="@style/ThemeOverlay.Toobar"
    ...>
Run Code Online (Sandbox Code Playgroud)

或者:

<androidx.appcompat.widget.Toolbar
    android:theme="@style/ThemeOverlay.Toobar"
    ...>
Run Code Online (Sandbox Code Playgroud)

其中带有Material Components 主题的主题覆盖是:

<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>
Run Code Online (Sandbox Code Playgroud)

带有 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>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


如果您SearchView在布局中使用 a ,您可以执行类似的操作:

   <androidx.appcompat.widget.SearchView
       android:theme="@style/ThemeOverlay.SearchView"
Run Code Online (Sandbox Code Playgroud)

   <style name="ThemeOverlay.SearchView" parent="">
        <!-- Text color -->
        <item name="android:editTextColor">@color/...</item>
        <!-- Hint text color -->
        <item name="android:textColorHint">@color/...</item>
    </style>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


小智 7

如果您使用 - 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);
Run Code Online (Sandbox Code Playgroud)


Arb*_*tur 7

为您创建一个样式 Toolbar

<style name="AppTheme.Toolbar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="android:editTextColor">@color/some_color</item>
</style>
Run Code Online (Sandbox Code Playgroud)

并将其设置为主题 Toolbar

<android.support.v7.widget.Toolbar
    android:theme="@style/AppTheme.Toolbar"
    ...
Run Code Online (Sandbox Code Playgroud)


Luk*_*ner 6

如果您正在使用android.support.v7.widget.SearchView,则可以不必使用反射.

这是我在我的应用程序中执行此操作的方式:

EditText text = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
ImageView searchCloseIcon = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
View searchPlate = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);

if (searchPlate != null) {
    searchPlate.setBackgroundResource(R.drawable.search_background);
}

if (text != null){
    text.setTextColor(resources.getColor(R.color.white));
    text.setHintTextColor(getResources().getColor(R.color.white));

    SpannableStringBuilder magHint = new SpannableStringBuilder("  ");
    magHint.append(resources.getString(R.string.search));

    Drawable searchIcon = getResources().getDrawable(R.drawable.ic_action_view_search);
    int textSize = (int) (text.getTextSize() * 1.5);
    searchIcon.setBounds(0, 0, textSize, textSize);
    magHint.setSpan(new ImageSpan(searchIcon), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    // Set the new hint text
    text.setHint(magHint);

}

if (searchCloseIcon != null){
    searchCloseIcon.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_close));
}
Run Code Online (Sandbox Code Playgroud)

它们不公开为非appcompat SearchView公开id,但如果您知道在哪里查看,它们会为AppCompat公开.:)


Ale*_*dre 5

我有这个问题,这对我有用.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.customer_menu, menu);
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView       = (SearchView) menu.findItem(R.id.menu_customer_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        searchView.setOnQueryTextListener(this);

        //Applies white color on searchview text
        int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
        TextView textView = (TextView) searchView.findViewById(id);
        textView.setTextColor(Color.WHITE);

        return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 我总是得到null:(TextView)searchView.findViewById(id); (4认同)

Bal*_*aji -2

我尝试找到一个解决方案。我想这会对你有帮助..

searchView.setBackgroundColor(Color.WHITE);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 问题说文本颜色不是背景颜色 (2认同)