web-dev-qa-db-fra.com

Modifier TextColor dans SearchView à l'aide de la barre d'outils Android

J'ai le problème suivant. J'ai configuré ma barre d'actions pour utiliser une barre d'outils à la place de l'API 21 avec appcompat-v7: 21. La balise de style textColorPrimary est configurée pour utiliser la couleur @Android:color/white, de sorte que tous les titres de la nouvelle barre d’outils Android auront une couleur de texte blanche (jusqu’à présent, tout va bien).

Maintenant, j'ai ajouté un SearchView et configuré un fond personnalisé comme suit:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/action_bar_background</item>
    <item name="colorPrimaryDark">@color/status_background</item>
    <item name="Android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="Android:textColorPrimary">@Android:color/white</item>
    <item name="searchViewStyle">@style/SearchViewStyle</item>
</style>

<style name="SearchViewStyle" parent="Widget.AppCompat.SearchView">
    <item name="queryBackground">@drawable/search_background</item>
    <item name="searchIcon">@drawable/icon_search</item>
</style>

Le @drawable/search_background dessiné est un rectangle blanc uni. Alors devine quoi? Comme la couleur du texte du titre dans la barre d’outils est blanche, la couleur du texte dans SearchView est également blanche, et comme l’arrière-plan de SearchView est un rectangle blanc, l’utilisateur ne peut pas voir ce qu’il tape.

Ma question est la suivante: comment puis-je avoir différentes couleurs de texte pour le titre de la barre d'outils Android et le texte de SearchView?

11
David_E

Après quelques recherches, j'ai trouvé un moyen sûr de le faire.

En fouillant dans les styles SearchView, j'ai trouvé la mise en page utilisée pour afficher SearchView. À l'intérieur de cette disposition, il y a un TextView (le champ où vous tapez dans SearchView)

<TextView
        Android:id="@+id/search_badge"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:gravity="center_vertical"
        Android:layout_marginBottom="2dip"
        Android:drawablePadding="0dip"
        Android:textAppearance="?android:attr/textAppearanceMedium"
        Android:textColor="?android:attr/textColorPrimary"
        Android:visibility="gone" />

Notez le champ Android:textColor="?android:attr/textColorPrimary". Cela cause le problème que j'avais initialement, la couleur du texte dans SearchView est la même que celle définie pour la couleur du texte du titre dans la barre d'outils Android.

Maintenant, il y a plusieurs solutions qui pourraient fonctionner ici , mais je pense que la plupart de ces solutions ont le même problème. Ils dépendent tous de l'id de TextView pour accéder à la vue et modifier la couleur du texte, comme décrit ici

Personnellement, je pense que coder en dur l'id de TextView dans le code est très risqué, car nous ne savons pas si demain Google utilisera une autre valeur pour cette vue, dans ce cas, notre code sera cassé.

Pour cette raison, j'ai créé une méthode récursive qui obtient l'objet TextView dans SearchView et modifie la couleur comme bon nous semble.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.search, menu);
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();

    searchView.setOnQueryTextListener(new SearchTextListener());
    changeSearchViewTextColor(searchView);
}


private void changeSearchViewTextColor(View view) {
    if (view != null) {
        if (view instanceof TextView) {
            ((TextView) view).setTextColor(Color.BLACK);
            return;
        } else if (view instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup) view;
            for (int i = 0; i < viewGroup.getChildCount(); i++) {
                changeSearchViewTextColor(viewGroup.getChildAt(i));
            }
        }
    }
}

J'ai testé ce code à l'aide de l'API 21 avec la barre d'outils, la couleur du texte du titre de la barre d'outils étant définie sur blanc et la configuration de la couleur du texte SearchView sur le noir, ce qui fonctionne parfaitement. De plus, étant donné que nous accédons directement à l'objet TextView, nous pouvons modifier l'indicateur, le dessin, les rembourrages et tout ce qui est lié à TextView.

24
David_E

Ceci est possible uniquement en XML en utilisant une ThemeOverlay:

<style name="ThemeOverlay.MyApp.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="autoCompleteTextViewStyle">@style/Widget.MyApp.AutoCompleteTextView.SearchView</item>
    <item name="searchViewStyle">@style/Widget.MyApp.SearchView</item>
</style>

<style name="Widget.MyApp.AutoCompleteTextView.SearchView" parent="Widget.AppCompat.AutoCompleteTextView">
    <item name="Android:textColor">#000</item>
    <item name="Android:textColorHint">#5000</item>
</style>

<style name="Widget.MyApp.SearchView" parent="Widget.AppCompat.SearchView">
    <item name="queryBackground">@drawable/search_background</item>
    <item name="searchIcon">@drawable/icon_search</item>
</style>

Et puis dans votre fichier de mise en page:

<Android.support.v7.widget.Toolbar
    app:theme="@style/ThemeOverlay.MyApp.ActionBar"
    ... />

Si vous souhaitez également qu'il s'applique aux activités qui utilisent une variable ActionBar au lieu d'une ToolBar, vous pouvez l'ajouter au thème Activity:

<style name="Theme.MyApp" parent="Theme.AppCompat">
    <item name="actionBarTheme">@style/ThemeOverlay.MyApp.ActionBar</item>
    ...
</style>
3
Jarett Millard

La solution de @ David_E fonctionne, mais il existe un autre moyen. Vous pouvez également définir une mise en page personnalisée:

<style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”>
    <item name="layout">@layout/my_Search_view</item>
</style>

Ensuite, vous pouvez prendre le fichier de présentation par défaut, que vous pouvez trouver par nom: abc_search_view.xml, utilisé par la vue de recherche et le modifier.

2
Igor Filippov

Changez simplement ou ajoutez un Android:textcolorPrimary à vos styles, tous vos styles dans certains cas. La couleur que vous choisirez pour cet article sera la couleur de votre texte searchview.

0
jenkins ernest