web-dev-qa-db-fra.com

Est-il possible de changer la couleur du texte sur un SearchView Android?

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?

97
CACuzcatlan

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

94
akdotcom

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

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

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;
}
23
Ferran Maylinch

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

15
johnarleyburns

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

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

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. :)

6
LukeWaggoner

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

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

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"
    ...
5
Arbitur

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.

3
Sharad

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 .... :)

3
DynamicMind

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);
}
3
Krishna Mohan Singh

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

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.

3
Tjeerd

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);
2
Fabio Guerra

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

2
Srinivasan

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

1
straya

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.

1
jfcartier

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/

1
Suhas Patil

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

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

Ce qui a fonctionné pour moi 

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

J'ai trouvé une solution à partir d'un article de blog. Voir ici .

En gros, vous appelez searchViewAutoCompleteTextView et Android: actionBarWidgetTheme en hérite.

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

0
Jimmy Ilenloa

ç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);
}
0
Hamza Awwad
TextView textView = (TextView) searchView.findViewById(R.id.search_src_text);
textView.setTextColor(Color.BLACK);
0
Yuwen