SearchView元素没有任何用于更改文本颜色的属性。默认文本颜色为黑色,不适用于我们的深色背景。有没有办法在不诉诸黑客的情况下改变文本的颜色?
我发现这个类似的问题与更改文本大小有关,但到目前为止,它没有任何答案: How to set SearchView TextSize?
答案 0 :(得分:99)
添加
<item name="android:editTextColor">@android:color/white</item>
到父主题,这应该更改输入的文本。您也可以使用
<item name="android:textColorHint">@android:color/white</item>
更改SearchView的提示文本。 (请注意,您可以使用您希望使用的任何适当值替换@android:color/white
)
答案 1 :(得分:90)
尝试这样的事情: 您将从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);
答案 2 :(得分:64)
这适合我。
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));
答案 3 :(得分:23)
我想做类似的事情。我终于不得不在TextView
个孩子中找到SearchView
:
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;
}
答案 4 :(得分: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>
确保您的应用程序使用enter link description here
中所述的主题自定义主题答案 5 :(得分:11)
对我来说,以下是有效的。 我使用了链接中的代码: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(android.support.v7.appcompat.R.id.search_src_text));
txtSearch.setHint(getResources().getString(R.string.search_hint));
txtSearch.setHintTextColor(Color.LTGRAY);
txtSearch.setTextColor(Color.WHITE);
Changing action bar searchview hint text color建议另一种解决方案。它可以工作但只设置提示文字和颜色。
searchView.setQueryHint(Html.fromHtml("<font color = #ffffff>" + getResources().getString(R.string.search_hint) + "</font>"));
答案 6 :(得分:10)
您可以通过在样式中设置editTextColor
属性来实现此目的。
<style name="SearchViewStyle" parent="Some.Relevant.Parent">
<item name="android:editTextColor">@color/some_color</item>
</style>
并将此样式应用于布局中的Toolbar
或SearchView
。
<android.support.v7.widget.Toolbar
android:theme="@style/SearchViewStyle">
<android.support.v7.widget.SearchView />
</android.support.v7.widget.Toolbar>
答案 7 :(得分: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公开。 :)
答案 8 :(得分:6)
如果您使用 - 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);
答案 9 :(得分: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;
}
答案 10 :(得分:5)
为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"
...
答案 11 :(得分: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);
使用它我使用此方法在提示中成功添加了红色*标记。 您应该根据您的要求更改此方法。 我希望它对你有帮助.... :)
答案 12 :(得分:3)
如果您的应用主题基于全息主题,您将在SearchView中获得白色而不是黑色文字
<style name="Theme.MyTheme" parent="android:Theme.Holo">
我没有找到任何其他方法来更改searchview的textcolor而不使用脏黑客。
答案 13 :(得分: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);
}
答案 14 :(得分:3)
最干净的方式是:
工具栏使用主题ThemeOverlay.AppCompat.Dark.Actionbar。
现在让孩子成为:
toolbarStyle parent&#34; ThemeOverlay.AppCompat.Dark.Actionbar&#34;
以该样式添加此项目
项目名称&#34; android:editTextColor&#34;&gt; yourcolor
完成。
另一个非常重要的事情是,在工具栏中放置layout_height =&#34;?attr / actionbarSize&#34;。默认情况下,它是wrap_content。对于我来说,在searchview中甚至看不到文本它修复了这个问题。
答案 15 :(得分:3)
您可以使用“视图”中的 android:theme
属性覆盖默认颜色。
如果您使用的是 Toolbar
或 MaterialToolbar
:
<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>
如果您在布局中使用 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 :(得分: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));
答案 17 :(得分:2)
更改键入文字的颜色:
((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);
答案 18 :(得分:2)
是的,我们可以,
SearchView searchView = (SearchView) findViewById(R.id.sv_symbol);
为搜索视图文本应用白色
int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);
快乐编码!!!!
答案 19 :(得分: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>
答案 20 :(得分:1)
这对我有用,如果您使用 androidx.appcompat.widget.SearchView 应用 androidx.appcompat.R.id.search_src_text 标识搜索视图, textView 中不返回null / p>
TextView textView = (TextView) searchView.findViewById(androidx.appcompat.R.id.search_src_text);
textView.setTextColor(Color.RED);
textView.setHintTextColorstrong text(Color.RED);
答案 21 :(得分:1)
通过使用此功能,我可以在搜索视图中更改键入的颜色文本
pluginversion.h
答案 22 :(得分:1)
for appcompat-v7带有searchView的工具栏(通过MenuItemCompat提供):
将工具栏主题设置为@ style / ThemeOverlay.AppCompat.Light将为提示文本和输入的文本生成深色(黑色),但不会影响光标*颜色。因此,将工具栏主题设置为@ style / ThemeOverlay.AppCompat.Dark将为提示文本和输入的文本生成浅色(白色),无论如何,光标*将为白色。
自定义上述主题:
android:textColorPrimary - &gt;输入文本的颜色
editTextColor - &gt;输入文本的颜色(将覆盖android的影响:如果设置了textColorPrimary)
android:textColorHint - &gt;提示的颜色
*注意:尚未确定如何控制光标颜色(不使用反射解决方案)。
答案 23 :(得分: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/
答案 24 :(得分: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
的视图层次结构,否则您应该能够使用此方法更改窗口小部件的外观一段时间。
答案 25 :(得分: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);
}
答案 26 :(得分:0)
我从博客文章中找到了一个解决方案。请参阅here。
基本上你设置searchViewAutoCompleteTextView样式并让android:actionBarWidgetTheme继承样式。
答案 27 :(得分:0)
TextView textView = (TextView) searchView.findViewById(R.id.search_src_text);
textView.setTextColor(Color.BLACK);
答案 28 :(得分: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图书馆。请注意 org.holoeverywhere.R.id.search_src_text
答案 29 :(得分:0)
什么对我有用
((EditText)searchView.findViewById(R.id.search_src_text)).setTextColor(getResources().getColor(R.color.text));
答案 30 :(得分:0)
使用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;
}
答案 31 :(得分: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)
答案 32 :(得分:-1)
这种方式:)
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 ;
}
答案 33 :(得分:-1)
您可以像这个类一样实现更改字体颜色和图像::
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
答案 34 :(得分:-1)
我试过找到一个解决方案。我想它会对你有帮助..
searchView.setBackgroundColor(Color.WHITE);
答案 35 :(得分:-3)
将 SearchView 投射到 TextView ,可以使用 TextView 的方法更改颜色:
((TextView) searchView).setTextColor(Color.WHITE);
((TextView) searchView).setHintTextColor(Color.WHITE);