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?
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)
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);
ç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));
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;
}
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
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>"));
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. :)
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>
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;
}
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);
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.
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));
ç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);
}
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 ....:)
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 !!!!
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"
...
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);
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.
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 /
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).
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);
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>
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.
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
TextView textView = (TextView) searchView.findViewById(R.id.search_src_text);
textView.setTextColor(Color.BLACK);
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.
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);
}
ce qui a fonctionné pour moi
((EditText)searchView.findViewById(R.id.search_src_text)).setTextColor(getResources().getColor(R.color.text));
j'ai essayé et trouver une solution pour ce. Je pense que ça va vous aider..
searchView.setBackgroundColor(Color.WHITE);
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