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

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

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

99781 次浏览

我试图找到一个解决办法。我认为它会帮助你. 。

searchView.setBackgroundColor(Color.WHITE);

enter image description here

如果你的应用程序主题基于 holo 主题,那么在 SearchView 中你会看到一个白色而不是黑色的文本

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

我没有找到任何其他方法来改变搜索视图的文本颜色而不使用脏黑客。

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

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

使用它,我已经成功地添加红色的颜色 * 标记在提示使用这种方法。 你应该根据自己的需要改变这种方法。 我希望这对你有帮助... ... :)

试试这样: 您可以从 sdk 获得文本视图的句柄,然后修改它,因为它们不公开暴露它。

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

用这个,对了

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

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

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

更改输入文字的颜色:

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

您可以实现如下类来更改字体颜色和图像:

import com.actionbarsherlock.widget.SearchView;
import com.actionbarsherlock.widget.SearchView.SearchAutoComplete;




public class MySearchView {
public static SearchView getSearchView(Context context, String strHint) {
SearchView searchView = new SearchView(context);
searchView.setQueryHint(strHint);
searchView.setFocusable(true);
searchView.setFocusableInTouchMode(true);
searchView.requestFocus();
searchView.requestFocusFromTouch();


ImageView searchBtn = (ImageView) searchView.findViewById(R.id.abs__search_button);
searchBtn.setImageResource(R.drawable.ic_menu_search);




ImageView searchBtnClose = (ImageView) searchView.findViewById(R.id.abs__search_close_btn);
searchBtnClose.setImageResource(R.drawable.ic_cancel_search_bar);




SearchAutoComplete searchText = (SearchAutoComplete) searchView.findViewById(R.id.abs__search_src_text);


searchText.setTextColor(context.getResources().getColor(color.white));


return searchView;
}




public static SearchView getSearchView(Context context, int strHintRes) {
return getSearchView(context, context.getString(strHintRes));
}
}

希望能帮到你们。 校对: D

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

我正在使用全息图书馆。请注意 Search _ src _ text

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

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的视图层次结构,否则您应该能够使用此方法在一段时间内更改小部件的外观。

这最好通过自定义样式来实现。用自定义样式重载操作栏小部件样式。对于全息光与黑暗的行动酒吧,把这在你自己的样式文件,如 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>

确保应用程序使用 在这里输入链接描述中描述的主题自定义主题

我想做一些类似的事情,最后我不得不在 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;
}

通过使用 appcompat v7库可以定制 searchview。我使用 appcompat v7库并为其定义了自定义样式。 在可绘制文件夹中放置 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>

在 value 文件夹 style _ 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" >

有关更多信息,请参见以下网址:
这里有一个关于 android 主题的 http://www.jayway.com/2014/06/02/android-theming-the-actionbar/

我从一篇博客文章中找到了一个解决方案。

基本上,您可以对 searchViewAutoCompleteTextView 进行样式化,并让 android: actionBarWidgetTheme 继承样式。

感谢@etzarMatt,我添加了 安卓支持。

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

    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 提示文本颜色 建议另一种解决方案。它可以工作,但只设置提示文本和颜色。

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

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

应该更改输入的文本。您还可以使用

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

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

如果您正在使用 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));
}

它们不会为非应用程序 SearchView 公开 id,但是如果您知道在哪里查找,它们会为 AppCompat 公开 id。:)

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

将工具栏主题设置为@style/ThemeOverlay。AppCompat.光线将为提示文本和输入的文本生成深色(黑色) ,但不会影响光标 * 颜色。相应地,将 Toolbar 主题设置为@style/ThemeOverlay。AppCompat.暗色将产生浅色(白色)的提示文本和输入的文本,光标 * 将是白色的。

定制上述主题:

输入文本的颜色

输入文本的颜色(如果设置了,将覆盖 android: textColor 的影响)

Android: textColorHint —— > 颜色提示

注意: 我还没有确定如何控制光标颜色(不使用反射溶液)。

是的,我们可以,

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

编程愉快!

这对我有用。

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

SearchView转换为 文本视图允许你使用 文本视图的方法来改变它的颜色:

((TextView) searchView).setTextColor(Color.WHITE);
((TextView) searchView).setHintTextColor(Color.WHITE);

对我有用

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

通过使用这个,我能够在搜索视图中更改输入的颜色文本

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

这对我有用。

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

可以通过在样式中设置 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>

如果您使用-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 支持库

哇,好多答案,它从你的原色中获取颜色值。

改变它,它的完成!

@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>

为您的 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"
...

最干净的方法是:

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

现在让它变成这样:

父“ ThemeOverlay. AppCompat. Dark. Actionbar”

以该样式添加此项

项目名称“ android: edit TextColor”> yourcolor

成交。

还有一件非常重要的事情是,在工具栏中放入 lay_ height =”?Attr/actionbarSize”。默认情况下,它是 wrash _ content。对我来说,文字甚至不可见在搜索视图它修复了这个问题。

这边走

View searchPlate = searchView.findViewById(searchPlateId);
if (searchPlate!=null) {
searchPlate.setBackgroundColor(Color.DKGRAY);
int searchTextId = searchPlate.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView searchText = (TextView) searchPlate.findViewById(searchTextId);
if (searchText != null) {
searchText.setTextColor(Color.WHITE);
searchText.setHintTextColor(Color.WHITE);
}
}
return ;
}

对我有用的东西

((EditText)searchView.findViewById(R.id.search_src_text)).setTextColor(getResources().getColor(R.color.text));

用 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 = 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)

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

如果你使用的是 ToolbarMaterialToolbar:

<com.google.android.material.appbar.MaterialToolbar
android:theme="@style/ThemeOverlay.Toobar"
...>

或:

<androidx.appcompat.widget.Toolbar
android:theme="@style/ThemeOverlay.Toobar"
...>

主题与 材料组成主题的叠加是:

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

enter image description here

这对我有用,如果你用 SearchView 应用 Search _ src _ text来标识 SearchView,在 < strong > textView 中不返回 null

    TextView textView = (TextView) searchView.findViewById(androidx.appcompat.R.id.search_src_text);
textView.setTextColor(Color.RED);
textView.setHintTextColorstrong text(Color.RED);

使用扩展名改变文本/提示颜色的 Kotlin 方法

fun SearchView.changeColors(color: Int) {
val editText = this.findViewById<EditText>(androidx.appcompat.R.id.search_src_text)
editText.setTextColor(ContextCompat.getColor(context, color))
editText.setHintTextColor(ContextCompat.getColor(context, color))
}

使用 Kotlin ad AndroidX,只需尝试以下操作:

val id: Int = binding.searchView.context
.resources
.getIdentifier("android:id/search_src_text", null, null)
val editText: EditText = binding.searchView.findViewById(id)
editText.setTextColor(Color.BLUE)
editText.setHintTextColor(Color.BLACK)