L'élément SearchView n'a pas de propriétés pour changer la couleur du texte. La couleur de texte par défaut est le noir et ne fonctionne pas sur notre fond sombre. Existe-t-il un moyen de changer la couleur du texte sans recourir à des hacks?
J'ai trouvé cette question similaire liée à la modification de la taille du texte, mais jusqu'à présent, il n'a pas de réponse: Comment définir SearchView TextSize?
Ajouter
<item name="Android:editTextColor">@Android:color/white</item>
au thème parent et cela devrait changer le texte saisi. Vous pouvez aussi utiliser
<item name="Android:textColorHint">@Android:color/white</item>
pour changer le texte de conseil pour SearchView. (Notez que vous pouvez remplacer le @Android:color/white
par la valeur appropriée que vous espérez utiliser.)
Essayez quelque chose comme ceci:.
int id = searchView.getContext().getResources().getIdentifier("Android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);
Cela fonctionne pour moi.
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));
Je voulais faire quelque chose de similaire. J'ai finalement dû trouver la TextView
parmi les enfants SearchView
:
for (TextView textView : findChildrenByClass(searchView, TextView.class)) {
textView.setTextColor(Color.WHITE);
}
Si vous voulez la méthode 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;
}
Ceci est mieux réalisé par le biais de styles personnalisés. Surchargez le style de widget de la barre d'action avec votre propre style personnalisé. Pour holo light avec barre d’action sombre, placez-le dans votre propre fichier de styles tel que 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>
Assurez-vous que votre application utilise un thème personnalisé tel que décrit dans entrez la description du lien ici
Pour moi, les travaux suivants ... J'ai utilisé le code d'un lien: Changer la couleur du texte de l'indicateur de recherche dans la barre d'actions à l'aide de la bibliothèque de support .
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);
Modification de la couleur du texte de la barre de recherche searchview conseille une autre solution. Cela fonctionne mais ne définit que le texte et la couleur.
searchView.setQueryHint(Html.fromHtml("<font color = #ffffff>" + getResources().getString(R.string.search_hint) + "</font>"));
Vous pouvez le faire en définissant l'attribut editTextColor
dans le style.
<style name="SearchViewStyle" parent="Some.Relevant.Parent">
<item name="Android:editTextColor">@color/some_color</item>
</style>
et vous appliquez ce style à Toolbar
ou à SearchView
dans la présentation.
<Android.support.v7.widget.Toolbar
Android:theme="@style/SearchViewStyle">
<Android.support.v7.widget.SearchView />
</Android.support.v7.widget.Toolbar>
Si vous utilisez Android.support.v7.widget.SearchView, il est possible de ne pas avoir à utiliser la réflexion.
Voici comment je le fais dans mon application:
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));
}
Ils n'exposent pas publiquement les identifiants pour SearchView non appcompat, mais ils le font pour AppCompat si vous savez où chercher. :)
J'ai eu ce problème, et cela fonctionne pour moi.
@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;
}
si vous utilisez - 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);
Créez un style pour votre Toolbar
<style name="AppTheme.Toolbar" parent="ThemeOverlay.AppCompat.ActionBar">
<item name="Android:editTextColor">@color/some_color</item>
</style>
Et définissez-le comme thème pour la Toolbar
<Android.support.v7.widget.Toolbar
Android:theme="@style/AppTheme.Toolbar"
...
Le moyen le plus propre est:
La barre d’outils utilise le thème ThemeOverlay.AppCompat.Dark.Actionbar.
Maintenant en faire un enfant comme:
toolbarStyle parent "ThemeOverlay.AppCompat.Dark.Actionbar"
ajouter cet article dans ce style
nom de l'article "Android: editTextColor"> yourcolor
Terminé.
Une autre chose très importante est que, dans la barre d’outils, mettez le layout_height = "? Attr/actionbarSize". Par défaut, c'est wrap_content.Pour moi, le texte n'était même pas visible dans searchview, il a résolu ce problème.
Oui, il est possible d’utiliser la méthode suivante.
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;
}
L'appel de cette méthode ressemble à ceci ..
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);
en l’utilisant j’ai ajouté avec succès la couleur rouge * repère en utilisant cette méthode . Vous devriez changer cette méthode en fonction de vos besoins . J'espère que cela vous sera utile .... :)
cela fonctionne pour moi.
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);
}
Utilisez celui-ci, c'est vrai. :RÉ
AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
searchText.setHintTextColor(getResources().getColor(color.black));
searchText.setTextColor(getResources().getColor(color.black));
Si vous basez le thème de votre application sur le thème holo, vous obtenez un texte blanc au lieu d'un texte noir dans votre SearchView
<style name="Theme.MyTheme" parent="Android:Theme.Holo">
Je n'ai pas trouvé d'autre moyen de changer la couleur du texte de la searchview sans utiliser de hacks sales.
Changer la couleur du texte saisi:
((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);
Changer la couleur du texte d'aide:
((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);
Oui nous pouvons,
SearchView searchView = (SearchView) findViewById(R.id.sv_symbol);
Pour appliquer la couleur blanche au texte SearchView,
int id = searchView.getContext().getResources().getIdentifier("Android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);
Bonne codage !!!!
pour appcompat-v7 Toolbar avec searchView (fourni via MenuItemCompat):
Définir le thème de la barre d’outils sur @ style/ThemeOverlay.AppCompat.Light donnera une couleur sombre (noir) pour le texte d’affichage et pour le texte saisi, mais n’affectera pas la couleur du curseur *. En conséquence, le fait de définir le thème de la barre d’outils sur @ style/ThemeOverlay.AppCompat.Dark donnera une couleur claire (blanc) pour le texte d’affichage et le texte saisi, le curseur * sera de toute façon blanc.
Personnaliser les thèmes ci-dessus:
Android: textColorPrimary -> couleur du texte saisi
editTextColor -> couleur du texte saisi (remplacera l'effet d'Android: textColorPrimary s'il est défini)
Android: textColorHint -> couleur de l'indice
* remarque: il reste encore à déterminer comment la couleur du curseur peut être contrôlée (sans utiliser la solution de réflexion).
Un objet SearchView
s'étend de LinearLayout
, de sorte qu'il contient d'autres vues. L'astuce consiste à trouver la vue contenant le texte d'aide et à modifier la couleur par programmation. Le problème lorsque vous essayez de trouver la vue par identifiant est que l'identifiant est dépendant du thème utilisé dans l'application. Donc, selon le thème utilisé, la méthode findViewById(int id)
peut renvoyer null
. Une meilleure approche qui fonctionne avec chaque thème consiste à parcourir la hiérarchie des vues et à trouver le widget contenant le texte d'aide:
// 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);
En utilisant cette méthode, vous pouvez également modifier l'aspect des autres widgets de la hiérarchie SearchView
, tels que le EditText
contenant la requête de recherche. Sauf si Google décide de modifier sous peu la hiérarchie d'affichage d'une SearchView
, vous devriez pouvoir modifier l'apparence du widget avec cette méthode pendant un certain temps.
Il est possible de personnaliser searchview à l'aide de la bibliothèque appcompat v7. J'ai utilisé la bibliothèque appcompat v7 et défini un style personnalisé pour celle-ci .
<?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>
Dans le dossier de valeurs 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>
J'ai défini le fichier custommenu.xml pour l'affichage du menu:
<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>
Votre activité doit étendre ActionBarActivity au lieu de Activity . Voici la méthode 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);
}
Dans le fichier manifeste:
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppnewTheme" >
Pour plus d'informations, voir cette URL:
Here http://www.jayway.com/2014/06/02/Android-theming-the-actionbar/
Sensationnel. Beaucoup de réponse. Il obtient la valeur de couleur de votre couleur primaire.
Changez-le et c'est fait!
@Override
public void onResume() {
super.onResume();
getActivity().setTheme(R.style.YourTheme_Searching);
}
Modes;
<style name="YourTheme.Searching" parent="YourTheme">
<item name="Android:textColorPrimary">@Android:color/white</item>
</style>
En utilisant cela, j'ai pu changer le texte de couleur tapé en mode recherche
AutoCompleteTextView typed_text = (AutoCompleteTextView) inputSearch.findViewById(inputSearch.getContext().getResources().getIdentifier("Android:id/search_src_text", null, null));
typed_text.setTextColor(Color.WHITE);
Ce qui a fonctionné pour moi
((EditText)searchView.findViewById(R.id.search_src_text)).setTextColor(getResources().getColor(R.color.text));
J'ai trouvé une solution à partir d'un article de blog. Voir ici .
En gros, vous appelez searchViewAutoCompleteTextView et Android: actionBarWidgetTheme en hérite.
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);
J'utilise Holoeverywhere Library. Notez le org.holoeverywhere.R.id.search_src_text
ça marche avec moi
@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);
}
TextView textView = (TextView) searchView.findViewById(R.id.search_src_text);
textView.setTextColor(Color.BLACK);