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


115

SearchView元素没有用于更改文本颜色的任何属性。默认的文字颜色是黑色,在我们的深色背景上不起作用。有没有办法改变文本的颜色而不求助于骇客?

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


1
我希望得到一个答案。
TheLettuceMaster 2012年

请提及您尝试过的内容。
萨希尔·玛哈詹

Answers:


121

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

更改为父主题,这将更改输入的文本。您也可以使用

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

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


1
这对我来说是固定的,并且不涉及使用反射的任何复杂的恶作剧。也可与appcompat一起使用。
dj_bushido 2015年

您还可以将searchview上的android:theme设置为具有android:editTextColor元素的样式。这样,您只会影响该搜索视图。
Pepijn 2015年

2
有用!我在扩展了ThemeOverlay.AppCompat.Light的工具栏内使用搜索视图,并添加了以上项,并在工具栏小部件上设置了样式;)就像一个魅力……
codename_47

该解决方案对我不起作用。文本仍然是错误的颜色。下面的设置提示颜色的答案以编程方式为我工作。
多米尼克

4
这个答案的问题在于,它还会更改EditTexts 的文本颜色。对我SearchView
ban-geoengineering

95

尝试这样的事情:您将从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);

我喜欢优雅的解决方案
Mohsen Afshin 2013年

29
这总是返回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

69

这对我有用。

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的形式获取视图,这也将起作用。
JuanJoséMeleroGómez2015年

是的,这是在遵循@JuanJoséMeleroGómez的建议之后为我工作的
Parth Patel

我想,这是从这里的答案复制并缩短的:stackoverflow.com/a/26251197/2914140
CoolMind

24

我想做类似的事情。我终于不得不TextViewSearchView孩子们中间找到他们:

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
这应该标记为已接受的答案。上面的为空。感谢您的好伙伴:)
blueware's

3
这个解决方案实在令人作呕,但它是唯一可行的解​​决方案,应归咎于Android团队!
Ofek Ron 2015年

我们将如何使用此图标访问搜索图标?
Yasin Yaqoobi

17

感谢@CzarMatt我添加了AndroidX支持。

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

    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>"));

1
使用androidx.appcompat.R.id.search_src_text如果你已经迁移了项目AndroidX。
CzarMatt

16

这最好通过自定义样式来实现。用您自己的自定义样式重载操作栏小部件样式。对于带有深色动作条的整体光,请将其放入您自己的样式文件中,例如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>

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


14

您可以通过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 imho的解决方案。尽可能使用视图样式。
马蒂亚斯(Mattias)

这应该是公认的答案!非常干净和容易。
MSeiz5 '19

8

如果使用-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);

在科特林

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

您应该现在就开始使用androidx支持库


7

为您的样式创建样式 Toolbar

<style name="AppTheme.Toolbar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="android:editTextColor">@color/some_color</item>
</style>

并将其设置为主题 Toolbar

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

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));
}

它们不会公开显示非appcompat SearchView的ID,但如果您知道在哪里查看,它们就会显示AppCompat。:)


实际上,这在各种设备上都可以很好地工作。好一个。
鲨鱼

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

4
我总是在以下方面得到null:(TextView)searchView.findViewById(id);
danielrvt-sgb

4

如果您将应用程序主题基于整体主题,则SearchView中将显示白色而不是黑色文本

<style name="Theme.MyTheme" parent="android:Theme.Holo">

我没有找到其他方法来更改searchview的文本颜色,而无需使用肮脏的技巧。


1
这没用。我希望这样做,因为它比手动搜索“魔术”视图ID干净得多。我尝试了几个主题,该主题的活动背景具有深色背景,但是除了SearchView中的黑色文本外,没有其他任何主题。
E-Riz 2013年

4

最干净的方法是:

工具栏使用主题ThemeOverlay.AppCompat.Dark.Actionbar。

现在让它成为子代:

工具栏样式父级“ ThemeOverlay.AppCompat.Dark.Actionbar”

以该样式添加此项

项目名称“ android:editTextColor“>您的颜色

做完了

还有一件非常重要的事情是,在工具栏中放入layout_height =“?attr / actionbarSize”。默认情况下,它是wrap_content。对我来说,文本甚至在searchview中都不可见,它解决了该问题。


4

是的,可以使用以下方法。

public static EditText setHintEditText(EditText argEditText, String argHintMessage, boolean argIsRequire) {
    try {
        if (argIsRequire) {
            argHintMessage = "   " + argHintMessage;
            //String text = "<font color=#8c8c8c>"+argHintMessage+"</font> <font color=#cc0029>*</font>";
            String text = "<font color=#8c8c8c>" + argHintMessage + "</font>";
            argEditText.setHint(Html.fromHtml(text));
        } else {
            argEditText.setHint(argHintMessage);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return argEditText;
}

调用此方法如下所示。

metLoginUserName=(EditText)this.findViewById(R.id.etLoginUserName);
    metLoginPassword=(EditText)this.findViewById(R.id.etLoginPassword);

    /**Set the hint in username and password edittext*/
    metLoginUserName=HotSpotStaticMethod.setHintEditText(metLoginUserName, getString(R.string.hint_username),true);
    metLoginPassword=HotSpotStaticMethod.setHintEditText(metLoginPassword, getString(R.string.hint_password),true);

使用它,我已经使用此方法成功在提示中添加了红色*标记。您应根据需要更改此方法。我希望它对您有帮助.... :)


对我来说有点复杂。
监狱2012

1
字符串文本=“ <font color =#8c8c8c>” + HintMessage +“ </ font>”; argEditText.setHint(Html.fromHtml(text)); 您还可以仅使用这两行代码来设置颜色提示
DynamicMind 2012

1
SearchAutoComplete autoCompleteView = (SearchAutoComplete) mSearchView .findViewById(com.android.internal.R.id.search_src_text);autoCompleteView.setHintTextColor(R.color.hint_text_color); 那是我的解决方案,但我认为您的解决方案比我的强,我将使用您的解决方案,谢谢。
监狱2012

@gaols您有解决方法吗?
DynamicMind 2012

@gaols,您的“ com.android.internal.R.id.search_src_text”在哪里?
wangqi060934

3

使用这个,是正确的。:D

AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
searchText.setHintTextColor(getResources().getColor(color.black));
searchText.setTextColor(getResources().getColor(color.black));

3

我们可以,

SearchView searchView = (SearchView) findViewById(R.id.sv_symbol);

要为SerachView文本应用白色,

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

编码愉快!!!


3

这为我工作。

final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);

searchView.setOnQueryTextListener(this);   
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));

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) 
{
    searchEditText.setBackgroundColor(getResources().getColor(R.color.c_trasnparent));
    searchEditText.setGravity(Gravity.CENTER);
    searchEditText.setCompoundDrawables(null,null,R.drawable.ic_cross,null);
}

3

更改输入文字的颜色:

((EditText)((SearchView)findViewById(R.id.searchView)).findViewById(((SearchView)findViewById(R.id.searchView)).getContext().getResources().getIdentifier("android:id/search_src_text", null, null))).setTextColor(Color.WHITE);

更改提示文本的颜色:

((EditText)((SearchView)findViewById(R.id.searchView)).findViewById(((SearchView)findViewById(R.id.searchView)).getContext().getResources().getIdentifier("android:id/search_src_text", null, null))).setHintTextColor(Color.LTGRAY);

2
TextView textView = (TextView) searchView.findViewById(R.id.search_src_text);
textView.setTextColor(Color.BLACK);

1

SearchView对象从延伸LinearLayout,所以它保持其它视图。诀窍是找到包含提示文本的视图并以编程方式更改颜色。尝试通过id查找视图的问题是id取决于应用程序中使用的主题。因此,根据使用的主题,该findViewById(int id)方法可能会返回null。适用于每个主题的更好的方法是遍历视图层次结构并找到包含提示文本的小部件:

// get your SearchView with its id
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
// traverse the view to the widget containing the hint text
LinearLayout ll = (LinearLayout)searchView.getChildAt(0);
LinearLayout ll2 = (LinearLayout)ll.getChildAt(2);
LinearLayout ll3 = (LinearLayout)ll2.getChildAt(1);
SearchView.SearchAutoComplete autoComplete = (SearchView.SearchAutoComplete)ll3.getChildAt(0);
// set the hint text color
autoComplete.setHintTextColor(getResources().getColor(Color.WHITE));
// set the text color
autoComplete.setTextColor(Color.BLUE);

使用此方法,您还可以更改SearchView层次结构中其他小部件的外观,例如EditText保留搜索查询。除非Google决定SearchView不久后更改视图层次结构,否则您应该可以使用此方法更改小部件的外观一段时间。


1

可以使用appcompat v7库来自定义searchview。我使用了appcompat v7库并为其定义了自定义样式。在drawable文件夹中,放置bottom_border.xml文件,如下所示:

 <?xml version="1.0" encoding="utf-8"?>
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
 <item>
  <shape >
      <solid android:color="@color/blue_color" />
  </shape>
 </item>
 <item android:bottom="0.8dp"
   android:left="0.8dp"
   android:right="0.8dp">
  <shape >
      <solid android:color="@color/background_color" />
  </shape>
 </item>

 <!-- draw another block to cut-off the left and right bars -->
 <item android:bottom="2.0dp">
  <shape >
      <solid android:color="@color/main_accent" />
  </shape>
  </item>
 </layer-list>

在值文件夹中的styles_myactionbartheme.xml中:

 <?xml version="1.0" encoding="utf-8"?>
 <resources>
  <style name="AppnewTheme" parent="Theme.AppCompat.Light">
    <item name="android:windowBackground">@color/background</item>
    <item name="android:actionBarStyle">@style/ActionBar</item>
    <item name="android:actionBarWidgetTheme">@style/ActionBarWidget</item>
  </style> 
  <!-- Actionbar Theme -->
  <style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@color/main_accent</item>
    <!-- <item name="android:icon">@drawable/abc_ic_ab_back_holo_light</item> -->
  </style> 
  <style name="ActionBarWidget" parent="Theme.AppCompat.Light">
    <!-- SearchView customization-->
     <!-- Changing the small search icon when the view is expanded -->
    <!-- <item name="searchViewSearchIcon">@drawable/ic_action_search</item> -->
     <!-- Changing the cross icon to erase typed text -->
   <!--   <item name="searchViewCloseIcon">@drawable/ic_action_remove</item> -->
     <!-- Styling the background of the text field, i.e. blue bracket -->
    <item name="searchViewTextField">@drawable/bottom_border</item>
     <!-- Styling the text view that displays the typed text query -->
    <item name="searchViewAutoCompleteTextView">@style/AutoCompleteTextView</item>        
  </style>

    <style name="AutoCompleteTextView" parent="Widget.AppCompat.Light.AutoCompleteTextView">
     <item name="android:textColor">@color/text_color</item>
   <!--   <item name="android:textCursorDrawable">@null</item> -->
    <!-- <item name="android:textColorHighlight">@color/search_view_selected_text</item> -->
  </style>
 </resources>

我定义了custommenu.xml文件来显示菜单:

 <menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:com.example.actionbartheme="http://schemas.android.com/apk/res-auto" >  

  <item android:id="@+id/search"
      android:title="@string/search_title"
      android:icon="@drawable/search_buttonn"
      com.example.actionbartheme:showAsAction="ifRoom|collapseActionView"
        com.example.actionbartheme:actionViewClass="android.support.v7.widget.SearchView"/>        
  </menu>

您的活动应扩展ActionBarActivity而不是Activity。这是onCreateOptionsMenu方法。

  @Override
  public boolean onCreateOptionsMenu(Menu menu) 
  {
    // Inflate the menu; this adds items to the action bar if it is present.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.custommenu, menu);
  }

在清单文件中:

  <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppnewTheme" >

有关更多信息,请参见以下网址:
此处http://www.jayway.com/2014/06/02/android-theming-the-actionbar/


1

适用于带有searchView的appcompat-v7工具栏(通过MenuItemCompat提供):

将工具栏主题设置为@ style / ThemeOverlay.AppCompat.Light将为提示文本和输入的文本产生深色(黑色),但不会影响光标*的颜色。因此,将工具栏主题设置为@ style / ThemeOverlay.AppCompat.Dark将为提示文本和输入的文本产生浅色(白色),但光标*始终为白色。

自定义以上主题:

android:textColorPrimary->输入文本的颜色

editTextColor->输入文本的颜色(如果设置,将覆盖android:textColorPrimary的影响)

android:textColorHint->提示的颜色

*注:尚未确定如何控制光标颜色(不使用反射解决方案)。


光标颜色来自colorControlActivated
亨利

1

通过使用此功能,我可以在搜索视图中更改键入的颜色文本

AutoCompleteTextView typed_text = (AutoCompleteTextView) inputSearch.findViewById(inputSearch.getContext().getResources().getIdentifier("android:id/search_src_text", null, null));
typed_text.setTextColor(Color.WHITE);

1

哇。很多答案。它从您的原色获取颜色值。

更改它,并完成!

@Override
public void onResume() {
    super.onResume();
    getActivity().setTheme(R.style.YourTheme_Searching);
}

样式;

<style name="YourTheme.Searching" parent="YourTheme">
    <item name="android:textColorPrimary">@android:color/white</item>
</style>

1

使用androidx更改工具栏中的searchView样式。

首先,在工具栏样式中设置搜索视图样式(使用您自己的应用更改父样式):

     <!-- toolbar style -->
      <style name="ToolbarStyle" parent="Theme.AppCompat.Light.NoActionBar">     
          <!-- search view about -->
          <item name="android:editTextColor">@color/colorWhitePrimaryText</item>
          <item name="android:textColorHint">@color/colorWhiteSecondaryText</item>
          <item name="android:textCursorDrawable">@drawable/drawable_cursor_white</item>
          <item name="closeIcon">@mipmap/ic_close</item>
          <item name="searchHintIcon">@mipmap/ic_search_white</item>
          <item name="searchIcon">@mipmap/ic_search_white</item>
          <item name="android:longClickable">false</item>
          <item name="android:queryHint">@string/toolbar_search</item>
      </style> 

然后,在您的工具栏布局中使用它:

android:theme="@style/ToolbarStyle"

这样,您可以更改除查询提示以外的大多数searchView样式。

最后在工具栏菜单的选项中设置查询提示:

toolbar.setOnMenuItemClickListener(item -> {
        switch (item.getItemId()){
            case R.id.toolbar_search:
                SearchView searchView = (SearchView) item.getActionView();
                searchView.setQueryHint("default query");
                searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                    @Override
                    public boolean onQueryTextSubmit(String query) {
                        return false;
                    }

                    @Override
                    public boolean onQueryTextChange(String newText) {
                        return false;
                    }
                });
                return true;
                default:
                    return false;
        }

您是要发布“ searchView样式”下的内容吗?
DavidW

我已经完成并简化了我的解决方案,也许可以为您提供帮助。
user2333 '19

0
searchView = (SearchView) view.findViewById(R.id.searchView);

SearchView.SearchAutoComplete searchText = (SearchView.SearchAutoComplete) searchView
      .findViewById(org.holoeverywhere.R.id.search_src_text);
searchText.setTextColor(Color.BLACK);

我正在使用Holoeverywhere Library。注意org.holoeverywhere.R.id.search_src_text


0

我从博客文章中找到了解决方案。看这里

基本上,您设置searchViewAutoCompleteTextView的样式并让android:actionBarWidgetTheme继承样式。


0

它对我有用

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem searchItem = menu.findItem(R.id.action_search);
    EditText searchEditText = (EditText) searchView.getActionView().findViewById(android.support.v7.appcompat.R.id.search_src_text);
    searchEditText.setTextColor(getResources().getColor(R.color.white));
    searchEditText.setHintTextColor(getResources().getColor(R.color.white));
    return super.onPrepareOptionsMenu(menu);
}


0

对于Kotlin语言

    searchView = view.findViewById(R.id.searchView_Contacts)
    // change color
    val id = searchView.context.resources
        .getIdentifier("android:id/search_src_text", null, null)

    val textView = searchView.findViewById<View>(id) as TextView

    textView.setTextColor(Color.WHITE)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.