web-dev-qa-db-ger.com

Ist es möglich, die Textfarbe in einer Android SearchView zu ändern?

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?

97
CACuzcatlan

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

94
akdotcom

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

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

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;
}
23
Ferran Maylinch

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

15
johnarleyburns

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>"));
10
CoolMind

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>
7
oldergod

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. :)

6
LukeWaggoner

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

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

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"
    ...
5
Arbitur

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.

3
Sharad

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.

3
DynamicMind

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

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

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.

3
Tjeerd

Ä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);
2
Fabio Guerra

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 !!!!

2
Srinivasan

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

1
straya

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.

1
jfcartier

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/

1
Suhas Patil

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>
1
MmtBkn

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

Was hat bei mir funktioniert? 

((EditText)searchView.findViewById(R.id.search_src_text)).setTextColor(getResources().getColor(R.color.text));
0

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.

0
leafartist
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

0
Jimmy Ilenloa

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);
}
0
Hamza Awwad
TextView textView = (TextView) searchView.findViewById(R.id.search_src_text);
textView.setTextColor(Color.BLACK);
0
Yuwen