Est-il possible de changer le textcolor sur un Android SearchView?

L'élément SearchView ne possède aucune propriété pour changer la couleur du texte. La couleur de texte par défaut est noire et ne fonctionne pas sur notre fond sombre. Est-il un moyen de changer la couleur du texte sans avoir recours à des hacks?

j'ai trouvé cette question similaire liés à la modification de la taille du texte, mais jusqu'à présent, il n'a pas de réponses: comment définir SearchView TextSize?

93
demandé sur Community 2012-07-04 04:51:00

30 réponses

ajouter

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

au thème parent et cela devrait changer le texte entré. Vous pouvez également utiliser

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

pour changer le texte d'indication pour le SearchView. (Notez que vous pouvez remplacer le @android:color/white par n'importe quelle valeur appropriée que vous espérez utiliser)

89
répondu akdotcom 2014-11-12 21:35:03

Essayez quelque chose comme ça : Vous obtiendriez un handle to the textview à partir du sdk et le changeriez car ils ne l'exposent pas publiquement.

int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);
88
répondu lokoko 2013-07-02 18:27:42

ça me va.

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));
60
répondu user2331095 2015-05-07 04:27:25

je voulais faire quelque chose de similaire. J'ai finalement dû trouver le TextView parmi les SearchView enfants:

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
répondu Ferran Maylinch 2014-05-07 15:54:50

Ceci est le mieux réalisé par des styles personnalisés. Surcharger le style widget de la barre d'action avec votre propre style personnalisé. Pour holo light avec dark action bar, mettez cela dans votre propre fichier de styles tels 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 le thème thème personnalisé comme décrit dans entrez la description du lien ici

15
répondu johnarleyburns 2014-04-20 16:15:50

pour moi les travaux suivants. J'ai utilisé un code à partir d'un lien: changer la couleur du texte de la recherche Conseil dans actionbar en utilisant la bibliothèque de soutien .

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

changer la barre d'action SearchView indice de couleur du texte conseille une autre solution. Il fonctionne, mais ne définit que le texte et la couleur des indices.

    searchView.setQueryHint(Html.fromHtml("<font color = #ffffff>" + getResources().getString(R.string.search_hint) + "</font>"));
10
répondu CoolMind 2017-05-23 12:26:15

si vous utilisez l'android.soutien.v7.widget.SearchView, c'est possible sans 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 les ids publiquement pour le non appcompat SearchView, mais ils le font pour AppCompat si vous savez où regarder. :)

6
répondu LukeWaggoner 2014-12-16 05:21:18

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 le SearchView dans la disposition.

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

    <android.support.v7.widget.SearchView />

</android.support.v7.widget.Toolbar>
6
répondu oldergod 2016-10-14 01:18:43

j'ai eu ce problème, et ça marche 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
répondu Alexandre 2013-03-01 14:41:28

si vous utilisez android.soutien.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
répondu zankoav 2017-03-09 09:36:15

si vous basez votre thème app sur le thème holo, vous obtiendrez un texte blanc au lieu d'un texte noir dans votre vue de recherche

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

Je n'ai pas trouvé d'autre moyen de changer la couleur du textde searchview sans utiliser dirty hacks.

3
répondu Tjeerd 2012-10-17 09:21:21

utilisez celui-ci, c'est bon. : 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
répondu sonida 2013-01-28 10:27:15

ça marche 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
répondu Krishna Mohan Singh 2017-02-02 08:42:27

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

appel de cette méthode ressemblent à 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 réussi à ajouter la couleur rouge * marque dans l'indice en utilisant cette méthode. Vous devez modifier cette méthode en fonction de vos besoins. J'espère que sa vous aider ....:)

3
répondu DynamicMind 2018-03-10 10:04:16

Oui nous pouvons

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

pour appliquer la couleur blanche pour le texte de SerachView,

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

bon codage !!!!

2
répondu Srinivasan 2015-04-10 05:38:32

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 en faire le thème du Toolbar

<android.support.v7.widget.Toolbar
    android:theme="@style/AppTheme.Toolbar"
    ...
2
répondu Arbitur 2017-07-24 14:23:10

changer la couleur du texte dactylographié:

((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'indice:

((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
répondu Fabio Guerra 2018-03-10 10:04:55

Un SearchView objet s'étend à partir de LinearLayout , il est titulaire d'autres points de vue. Le truc est de trouver la vue contenant le texte de l'indice et de changer la couleur de façon programmatique. Le problème en essayant de trouver la vue par id est que l'id dépend du thème utilisé dans l'application. Ainsi, selon le thème utilisé, la méthode findViewById(int id) pourrait retourner null . Une meilleure approche qui fonctionne avec chaque thème est de parcourir la hiérarchie des vues et de trouver le widget contenant le astuce texte:

// 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 changer l'apparence d'autres widgets dans la hiérarchie SearchView , comme le EditText contenant la requête de recherche. A moins que Google ne décide de changer la hiérarchie de la vue d'un SearchView sous peu, vous devriez être en mesure de changer l'apparence du widget avec cette méthode pendant un certain temps.

1
répondu jfcartier 2014-03-11 04:13:17

il est possible de personnaliser searchview en utilisant la bibliothèque appcompat v7.J'ai utilisé la bibliothèque V7 d'appcompat et défini le style personnalisé pour elle. Dans le dossier drawable mettre bottom_border.fichier xml qui ressemble à ceci:

 <?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 valeurs folder 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 custommenu.fichier 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é devrait étendre L'Activitéactionnelle au lieu de Activité. Voici la méthode de treateoptionsmenu.

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

Ici http://www.jayway.com/2014/06/02/android-theming-the-actionbar /

1
répondu Suhas Patil 2014-09-22 10:57:38

pour appcompat - V7 barre d'outils avec searchView (fourni par MenuItemCompat):

Réglage de la Barre d'outils du thème de @style/ThemeOverlay.AppCompat.La lumière donnera une couleur foncée (noire) pour le texte indicateur et pour le texte entré, mais n'affectera pas la couleur du curseur*. En conséquence, placer le thème de la barre d'Outils À @style / ThemeOverlay.AppCompat.L'obscurité donnera une couleur claire (blanc) pour le texte indicateur et le texte entré, le curseur* sera blanc de toute façon.

Personnaliser les thèmes ci-dessus:

android: textColorPrimary -- > couleur du texte entré

editTextColor --> couleur du texte entré (va annuler l'affect de android: textColorPrimary si défini)

android: textColorHint -- > couleur de l'indice

* note: je n'ai pas encore déterminé comment la couleur du curseur peut être contrôlée (sans utiliser la solution de réflexion).

1
répondu straya 2015-01-23 01:31:25

en utilisant ceci j'ai pu changer le texte en couleur tapé dans la vue de recherche

AutoCompleteTextView typed_text = (AutoCompleteTextView) inputSearch.findViewById(inputSearch.getContext().getResources().getIdentifier("android:id/search_src_text", null, null));
typed_text.setTextColor(Color.WHITE);
1
répondu Dhriti 2016-05-22 15:33:41

Wow. Beaucoup de réponse. Il obtient la valeur de la couleur de votre couleur primaire.

changez-le, et c'est fait!

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

Styles;

<style name="YourTheme.Searching" parent="YourTheme">
    <item name="android:textColorPrimary">@android:color/white</item>
</style>
1
répondu MmtBkn 2017-04-12 18:19:14

la manière la plus propre est:

barre d'Outils utilise le thème ThemeOverlay.AppCompat.Sombre.Actionbar.

Maintenant, les enfants, comme:

toolbarStyle parent " ThemeOverlay.AppCompat.Sombre.Actionbar"

ajouter cet article dans ce style

nom de l'article" android:editTextColor ">yourcolor

fait.

une autre chose très importante est, dans toolbar mettre 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 corrigé ce problème.

1
répondu Sharad 2017-08-08 12:06:28
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. Note the org.Holo everywhere.R. id.search_src_text

0
répondu Jimmy Ilenloa 2014-03-03 02:31:46
TextView textView = (TextView) searchView.findViewById(R.id.search_src_text);
textView.setTextColor(Color.BLACK);
0
répondu Yuwen 2014-03-07 22:51:42

j'ai trouvé une solution à partir d'un billet de blog. Voir ici .

fondamentalement vous Style searchviewautocompletetetextview et ont android: actionBarWidgetTheme hériter le style.

0
répondu leafartist 2014-10-05 15:38:27

il travaille 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
répondu Hamza Awwad 2018-03-10 10:05:52

ce qui a fonctionné pour moi

((EditText)searchView.findViewById(R.id.search_src_text)).setTextColor(getResources().getColor(R.color.text));
0
répondu Suneet Srivastava 2018-08-02 07:36:19

j'ai essayé et trouver une solution pour ce. Je pense que ça va vous aider..

searchView.setBackgroundColor(Color.WHITE);

enter image description here

-1
répondu Balaji 2012-08-15 07:38:14

vous pouvez mettre en œuvre comme cette classe pour changer la couleur de la police et de l'image::

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

j'espère que ça vous aidera. : D

-1
répondu sonida 2013-10-03 17:43:18