Comment puis-je changer la couleur du texte de la vue de recherche de la barre d’action?
Cette question explique comment obtenir le EditText avec ABS: Android ActionBar Customize Search View
Existe-t-il un fichier Android.R.id que je pourrais utiliser pour obtenir une référence à EditText afin de pouvoir modifier la couleur de l'indice? Ou y a-t-il un autre moyen de changer la couleur?
Android: actionBarWidgetTheme de votre thème principal doit pointer vers un style comportant un Android: textColorHint. Celui-ci permettra de changer la couleur du texte de la vue de recherche.
searchView.setQueryHint(Html.fromHtml("<font color = #ffffff>" + getResources().getString(R.string.hintSearchMess) + "</font>"));
SearchView searchView= (SearchView) findViewById(R.id.searchView1);
int id = searchView.getContext()
.getResources()
.getIdentifier("Android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);
cela a fonctionné pour moi, espérons que cela aide
((EditText) searchView.findViewById(Android.support.v7.appcompat.R.id.search_src_text)).setHintTextColor(getResources().getColor(R.color.white));
Je l'ai résolu en ajoutant cette propriété au thème principal:
<style name="AppTheme" parent="AppBaseTheme">
.....
.....
<item name="Android:actionBarWidgetTheme">@style/MyActionBarWidgetTheme</item>
</style>
Et ajoutez ensuite la propriété que je souhaite modifier dans ce cas, la couleur de l'indice.
<style name="MyActionBarWidgetTheme" parent="@Android:style/Theme.Holo">
.....
.....
<item name="Android:textColorHint">@color/blanco_60</item>
</style>
J'espère que ça aide: D
Voici précisément comment vous appliquez le style évoqué ci-dessus. La bonne solution consiste à surcharger 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
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'indice et à modifier la couleur par programmation. En parcourant la hiérarchie des vues, vous pouvez trouver le widget contenant le texte de conseil:
// 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));
Cette méthode fonctionne avec n'importe quel thème. En outre, vous pouvez modifier l'aspect des autres widgets de la hiérarchie SearchView
, tels que celui EditText
contenant la requête de recherche.
Obtenez juste le textView
id du widget de recherche et utilisez la méthode setTextColor()
pour modifier la couleur du texte de recherche et setHintTextColor()
pour modifier la couleur du texte des indications de recherche.
// Get textview id of search widget
int id = searchView.getContext().getResources().getIdentifier("Android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
// Set search text color
textView.setTextColor(Color.WHITE);
// Set search hints color
textView.setHintTextColor(Color.GRAY);
Si vous souhaitez modifier le bouton de flèche gauche en mode recherche, ajoutez app: collapseIcon.
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="@color/colorPrimary"
app:collapseIcon="@drawable/ic_search_view_home"
/>
Si vous souhaitez modifier la couleur du texte et la couleur de l'indication de texte, ajoutez ce qui suit.
EditText searchEditText = searchView.findViewById(Android.support.v7.appcompat.R.id.search_src_text);
searchEditText.setTextColor(Color.WHITE);
searchEditText.setHintTextColor(Color.WHITE);
Si vous souhaitez modifier l’icône de fermeture, ajoutez ce qui suit.
ImageView imvClose = searchView.findViewById(Android.support.v7.appcompat.R.id
.search_close_btn);
imvClose.setImageResource(R.drawable.ic_search_view_close);
Avec la bibliothèque appcompat la plus récente (ou si vous ciblez 5.0+), il est possible de le faire uniquement en XML en utilisant un ThemeOverlay
:
<style name="ThemeOverlay.MyApp.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar">
<item name="autoCompleteTextViewStyle">@style/Widget.MyApp.AutoCompleteTextView.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>
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 un ActionBar
au lieu d'un Toolbar
, vous pouvez l'ajouter au thème de Activity
:
<style name="Theme.MyApp" parent="Theme.AppCompat">
<item name="actionBarTheme">@style/ThemeOverlay.MyApp.ActionBar</item>
...
</style>
Regardez dans cette classe, cela peut vous aider à résoudre votre problème
import Android.R.color;
import Android.content.Context;
import Android.graphics.Typeface;
import Android.widget.ImageView;
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);
setFont(context, searchText);
searchText.setTextColor(context.getResources().getColor(color.white));
searchText.setHintTextColor(context.getResources().getColor(color.white));
return searchView;
}
private static void setFont(Context _context, SearchAutoComplete searchText) {
Typeface tf = null;
Typeface currentType = searchText.getTypeface();
if (currentType == null) {
tf = MyApplication.fontNormal;
}
else {
int currentStyle = currentType.getStyle();
if (currentStyle == Typeface.BOLD) {
tf = MyApplication.fontBold;
}
else if (currentStyle == Typeface.BOLD_ITALIC) {
tf = MyApplication.fontBoldItalic;
}
else if (currentStyle == Typeface.ITALIC) {
tf = MyApplication.fontItalic;
}
else {
tf = MyApplication.fontNormal;
}
}
searchText.setTypeface(tf);
}
public static SearchView getSearchView(Context context, int strHintRes) {
return getSearchView(context, context.getString(strHintRes));
}
}
Essayez ce code. C'est très facile.
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.search).getActionView();
EditText searchEditText = (EditText) searchView.findViewById(Android.support.v7.appcompat.R.id.search_src_text);
searchEditText.setHint("Search");
searchEditText.setHintTextColor(getResources().getColor(R.color.white));
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchEditText.setHintTextColor (getResources (). getColor (R.color.white));
La solution pour changer la couleur du texte d'affichage de la vue de recherche est la suivante:
SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete)searchView.findViewById(Android.support.v7.appcompat.R.id.search_src_text);
searchAutoComplete.setHintTextColor(Color.GRAY);
En utilisant cela, vous pouvez changer le xml consultable
int searchHintBtnId = searchView.getContext().getResources() .getIdentifier("Android:id/search_mag_icon", null, null); int hintTextId = searchView.getContext() .getResources() .getIdentifier("Android:id/search_src_text", null, null); int closeBtnId = searchView.getContext() .getResources() .getIdentifier("Android:id/search_close_btn", null, null); // Set the search plate color to white int searchPlateId = getResources().getIdentifier("Android:id/search_plate", null, null); View view = searchView.findViewById(searchPlateId); view.setBackgroundResource(R.drawable.search_plate); ImageView closeIcon = (ImageView) searchView.findViewById(closeBtnId); closeIcon.setImageResource(R.drawable.close); ImageView searchHintIcon = (ImageView) searchView.findViewById(searchHintBtnId); searchHintIcon.setImageResource(R.drawable.search); TextView textView = (TextView) searchView.findViewById(hintTextId); textView.setTextColor(getResources().getColor(R.color.search_text_color)); textView.setHintTextColor(getResources().getColor(R.color.search_hint_text_color));
Voici drawable/search_plate.xml
<!-- main color --> <item Android:bottom="1dp" Android:left="1dp" Android:right="1dp"> <shape > <solid Android:color="@color/app_theme_color" /> </shape> </item> <!-- draw another block to cut-off the left and right bars --> <item Android:bottom="10.0dp"> <shape > <solid Android:color="@color/app_theme_color" /> </shape> </item> </layer-list>
C'est très simple à réaliser avec le styles.xml
Il suffit de comprendre que le thème de SearchView est directement lié au thème de la barre d’outils à partir duquel menu.xml
il est récupéré comme un app:actionViewClass
.
Vous pouvez également définir manuellement SearchView sur votre menuItem et ainsi avoir le plein contrôle de la vue.
int id = searchView.getContext().getResources().getIdentifier("Android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);
textView.setHintTextColor(Color.WHITE);