Das SearchView-Element hat keine Eigenschaften zum Ändern der Textfarbe. Die Standardtextfarbe ist schwarz und funktioniert nicht auf unserem dunklen Hintergrund. Gibt es eine Möglichkeit, die Farbe des Textes zu ändern, ohne auf Hacks zurückzugreifen?
Ich habe diese ähnliche Frage im Zusammenhang mit der Änderung der Textgröße gefunden, sie hat jedoch bisher keine Antworten: Wie kann ich SearchView TextSize einstellen?
Hinzufügen
<item name="Android:editTextColor">@Android:color/white</item>
zum übergeordneten Thema und das sollte den eingegebenen Text ändern. Sie können auch verwenden
<item name="Android:textColorHint">@Android:color/white</item>
um den Hinweistext für die SearchView zu ändern. (Beachten Sie, dass Sie den @Android:color/white
durch einen beliebigen Wert ersetzen können, den Sie verwenden möchten.)
Versuchen Sie etwas wie das: Sie würden von der SDK einen Text für die Textansicht erhalten und dann ändern, da sie ihn nicht öffentlich verfügbar machen.
int id = searchView.getContext().getResources().getIdentifier("Android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);
Das funktioniert für mich.
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));
Ich wollte etwas Ähnliches machen. Ich musste schließlich die TextView
unter den SearchView
-Kindern finden:
for (TextView textView : findChildrenByClass(searchView, TextView.class)) {
textView.setTextColor(Color.WHITE);
}
Wenn Sie die util-Methode wünschen:
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;
}
Dies wird am besten durch benutzerdefinierte Stile erreicht. Überladen Sie den Widget-Stil der Aktionsleiste mit Ihrem eigenen benutzerdefinierten Stil. Für Holo-Licht mit dunkler Aktionsleiste fügen Sie dies in Ihre eigene Styles-Datei ein, beispielsweise 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>
Stellen Sie sicher, dass Ihre Anwendung ein benutzerdefiniertes Thema verwendet, wie in Linkbeschreibung hier eingeben
Für mich funktioniert Folgendes: Ich habe einen Code aus einem Link verwendet: Ändern Sie die Textfarbe des Suchhinweises in der Aktionsleiste mithilfe der Unterstützungsbibliothek .
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);
Ändern der Suchleiste für die Aktionsleiste rät eine andere Lösung. Es funktioniert, setzt aber nur Hinweistext und Farbe.
searchView.setQueryHint(Html.fromHtml("<font color = #ffffff>" + getResources().getString(R.string.search_hint) + "</font>"));
Sie können dies tun, indem Sie das editTextColor
-Attribut im Stil festlegen.
<style name="SearchViewStyle" parent="Some.Relevant.Parent">
<item name="Android:editTextColor">@color/some_color</item>
</style>
und Sie wenden diesen Stil auf Toolbar
oder SearchView
im Layout an.
<Android.support.v7.widget.Toolbar
Android:theme="@style/SearchViewStyle">
<Android.support.v7.widget.SearchView />
</Android.support.v7.widget.Toolbar>
Wenn Sie die Android.support.v7.widget.SearchView verwenden, ist dies ohne Reflektion möglich.
So mache ich das in meiner App:
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));
}
Sie machen die IDs nicht öffentlich für SearchView verfügbar, aber nicht AppCompat, wenn Sie wissen, wo sie suchen müssen. :)
Ich hatte dieses Problem und das funktioniert für mich.
@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;
}
wenn Sie - Android.support.v7.widget.SearchView verwenden
SearchView searchView = (SearchView) item.getActionView();
EditText editText = (EditText) searchView.findViewById(Android.support.v7.appcompat.R.id.search_src_text);
editText.setTextColor(Color.WHITE);
Erstellen Sie einen Stil für Ihre Toolbar
<style name="AppTheme.Toolbar" parent="ThemeOverlay.AppCompat.ActionBar">
<item name="Android:editTextColor">@color/some_color</item>
</style>
Und setze es als Design für die Toolbar
<Android.support.v7.widget.Toolbar
Android:theme="@style/AppTheme.Toolbar"
...
Der sauberste Weg ist:
Die Symbolleiste verwendet das Design ThemeOverlay.AppCompat.Dark.Actionbar.
Jetzt mache Kind davon:
toolbarStyle-übergeordnetes Element "ThemeOverlay.AppCompat.Dark.Actionbar"
fügen Sie diesen Artikel in diesem Stil hinzu
artikelname "Android: editTextColor"> Ihre Farbe
Erledigt.
Eine weitere sehr wichtige Sache ist, dass in der Symbolleiste layout_height = "? Attr/actionbarSize" steht. Standardmäßig ist dies wrap_content.Für mich war Text in searchview nicht einmal sichtbar, so wurde das Problem behoben.
Ja, es ist mit folgender Methode möglich.
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;
}
Der Aufruf dieser Methode sieht folgendermaßen aus.
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);
mit dieser Methode habe ich erfolgreich rote Farbe hinzugefügt.
das funktioniert für mich.
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);
}
Verwenden Sie dieses, es ist richtig. : D
AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
searchText.setHintTextColor(getResources().getColor(color.black));
searchText.setTextColor(getResources().getColor(color.black));
Wenn Sie Ihr App-Theme auf dem Holo-Theme basieren, wird in Ihrem SearchView ein weißer anstelle eines schwarzen Textes angezeigt
<style name="Theme.MyTheme" parent="Android:Theme.Holo">
Ich habe keine andere Möglichkeit gefunden, um die Textfarbe der Suchansicht zu ändern, ohne schmutzige Hacks zu verwenden.
Ändern Sie die Farbe des eingegebenen Textes:
((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);
Farbe des Hinweistextes ändern:
((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);
Ja wir können,
SearchView searchView = (SearchView) findViewById(R.id.sv_symbol);
Um die weiße Farbe für den SearchView-Text anzuwenden,
int id = searchView.getContext().getResources().getIdentifier("Android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);
Viel Spaß beim Programmieren !!!!
für appcompat-v7 Toolbar mit searchView (über MenuItemCompat bereitgestellt):
Wenn Sie das Symbolleisten-Design auf @ style/ThemeOverlay.AppCompat.Light einstellen, wird eine dunkle Farbe (Schwarz) für den Hinweistext und den eingegebenen Text angezeigt, die Farbe des Cursors * wird jedoch nicht beeinflusst. Wenn Sie also das Symbolleisten-Design auf @ style/ThemeOverlay.AppCompat.Dark setzen, wird für den Hinweistext und den eingegebenen Text eine helle Farbe (weiß) angezeigt. Der Cursor * ist ohnehin weiß.
Anpassen der obigen Themen:
Android: textColorPrimary -> Farbe des eingegebenen Textes
editTextColor -> Farbe des eingegebenen Textes (überschreibt den Einfluss von Android: textColorPrimary, falls gesetzt)
Android: textColorHint -> Farbe des Hinweises
* Hinweis: Ich möchte noch nicht bestimmen, wie die Cursorfarbe gesteuert werden kann (ohne die Reflexionslösung zu verwenden).
Ein SearchView
-Objekt erstreckt sich von LinearLayout
, sodass es auch andere Ansichten enthält. Der Trick besteht darin, die Ansicht mit dem Hinweistext zu finden und die Farbe programmgesteuert zu ändern. Das Problem beim Versuch, die Ansicht anhand der ID zu finden, besteht darin, dass die ID von dem in der Anwendung verwendeten Design abhängig ist. Abhängig von dem verwendeten Design gibt die findViewById(int id)
-Methode möglicherweise null
zurück. Ein besserer Ansatz, der mit jedem Thema funktioniert, besteht darin, die Ansichtshierarchie zu durchlaufen und das Widget mit dem Hinweistext zu finden:
// 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);
Mit dieser Methode können Sie auch das Aussehen anderer Widgets in der SearchView
-Hierarchie ändern, z. B. die EditText
, die die Suchabfrage enthält. Wenn Google nicht beschließt, die Ansichtshierarchie einer SearchView
in Kürze zu ändern, sollten Sie das Erscheinungsbild des Widgets mit dieser Methode für einige Zeit ändern können.
Es ist möglich, die Suchansicht mit der appcompat v7-Bibliothek anzupassen. Ich habe die appcompat v7-Bibliothek verwendet und einen benutzerdefinierten Stil dafür definiert.
<?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>
Im Werteordner 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>
Ich habe die Datei custommenu.xml für die Anzeige des Menüs definiert:
<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>
Ihre Aktivität sollte ActionBarActivity anstelle von Activity erweitern. Hier ist die onCreateOptionsMenu-Methode.
@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);
}
In der Manifestdatei:
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppnewTheme" >
Weitere Informationen finden Sie unter dieser URL:
Hier http://www.jayway.com/2014/06/02/Android-theming-the-actionbar/
Beeindruckend. Viel antwort Sie erhält den Farbwert von Ihrer Primärfarbe.
Ändern Sie es und es ist fertig!
@Override
public void onResume() {
super.onResume();
getActivity().setTheme(R.style.YourTheme_Searching);
}
Stile;
<style name="YourTheme.Searching" parent="YourTheme">
<item name="Android:textColorPrimary">@Android:color/white</item>
</style>
Dadurch konnte ich den eingegebenen Farbtext in der Suchansicht ändern
AutoCompleteTextView typed_text = (AutoCompleteTextView) inputSearch.findViewById(inputSearch.getContext().getResources().getIdentifier("Android:id/search_src_text", null, null));
typed_text.setTextColor(Color.WHITE);
Was hat bei mir funktioniert?
((EditText)searchView.findViewById(R.id.search_src_text)).setTextColor(getResources().getColor(R.color.text));
Ich habe eine Lösung aus einem Blogbeitrag gefunden. Siehe hier .
Grundsätzlich haben Sie den Stil searchViewAutoCompleteTextView und haben Android: actionBarWidgetTheme erbt den Stil.
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);
Ich benutze Holoeverywhere Library. Beachten Sie das org.holoeverywhere.R.id.search_src_text
es funktioniert bei mir
@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);
}
TextView textView = (TextView) searchView.findViewById(R.id.search_src_text);
textView.setTextColor(Color.BLACK);