Czy można zmienić kolor tekstu w widoku wyszukiwania w systemie Android?


115

Element SearchView nie ma żadnych właściwości do zmiany koloru tekstu. Domyślny kolor tekstu to czarny i nie działa na naszym ciemnym tle. Czy istnieje sposób na zmianę koloru tekstu bez uciekania się do hacków?

Znalazłem podobne pytanie związane ze zmianą rozmiaru tekstu, ale jak dotąd nie ma na nie żadnych odpowiedzi: Jak ustawić SearchView TextSize?


1
Bardzo chciałbym odpowiedzieć na to pytanie.
TheLettuceMaster

proszę wspomnieć, czego próbowałeś.
Sahil Mahajan Mj

Odpowiedzi:


121

Dodaj

<item name="android:editTextColor">@android:color/white</item>

do motywu nadrzędnego, co powinno zmienić wprowadzony tekst. Możesz także użyć

<item name="android:textColorHint">@android:color/white</item>

aby zmienić tekst wskazówki dla SearchView. (Pamiętaj, że możesz zastąpić @android:color/whitedowolną odpowiednią wartością, której chcesz użyć)


1
To naprawiło to dla mnie i nie wymagało żadnych skomplikowanych oszustw wykorzystujących refleksję. Działa również z appcompat.
dj_bushido,

Możesz również ustawić android: theme w widoku wyszukiwania na styl zawierający element android: editTextColor. W ten sposób wpływasz tylko na ten widok wyszukiwania.
Pepijn

2
To działa! Używałem widoku wyszukiwania w pasku narzędzi, rozszerzono ThemeOverlay.AppCompat.Light i dodałem powyższy element i ustawiłem styl na widżecie paska narzędzi;) Działa jak urok ...
nazwa_kodowa_47

To rozwiązanie nie działa dla mnie. Tekst nadal ma niewłaściwy kolor. Poniższa odpowiedź z ustawieniem koloru podpowiedzi zadziałała programowo.
Dominik

4
Problem z tą odpowiedzią polega na tym, że zmieni ona również kolor tekstu twojego EditTexts. Jedyne rozwiązanie, które zadziałało dla mnie, które zmienia SearchViewsam kolor tekstu, jest tutaj: stackoverflow.com/a/40550067/1617737
ban-geoengineering

96

Spróbuj czegoś takiego: dostaniesz uchwyt do widoku tekstowego z zestawu SDK, a następnie zmienisz go, ponieważ nie ujawniają go publicznie.

int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);

Lubię eleganckie rozwiązania
Mohsen Afshin

29
To zawsze zwraca wartość null
danielrvt-sgb

Zauważ, że jeśli używasz ActionBarSherlock, identyfikatory widoków będą inne. Na przykład biblioteka aktualnie ustawia identyfikator edycji tekstu na „package: id / abs__search_src_text”, do którego można uzyskać bezpośredni dostęp przez R.id.abs__search_src_text.
greg7gkb

3
Co więcej, tak naprawdę chciałem zmienić kolor tekstu podpowiedzi SearchView, co można łatwo zrobić za pomocą textView.setHintTextColor ().
greg7gkb

3
To bardzo brudny hack. Zastosowanie android: editTextColor i Android: textColorHint zamiast jak akdotcom zasugerował
Philipp Hofmann

69

To działa dla mnie.

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

1
Działa to również, jeśli uzyskasz widok jako TextView lub nawet jako AutoCompleteTextView.
Juan José Melero Gómez

Tak, to dla mnie praca po zastosowaniu się do sugestii @ JuanJoséMeleroGómez
Parth Patel

Przypuszczam, że zostało to skopiowane i skrócone z mojej odpowiedzi tutaj: stackoverflow.com/a/26251197/2914140 .
CoolMind

24

Chciałem zrobić coś podobnego. W końcu musiałem znaleźć TextViewwśród SearchViewdzieci:

for (TextView textView : findChildrenByClass(searchView, TextView.class)) {
    textView.setTextColor(Color.WHITE);
}

Jeśli chcesz użyć metody:

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

3
Ja również otrzymywałem zerowy wyjątek w poprzednich rozwiązaniach i to zadziałało!
Diego Ponciano

1
Powinno to zostać oznaczone jako zaakceptowana odpowiedź. Powyższy daje null. Dzięki za dobrą pracę, kolego :)
blueware

3
To rozwiązanie jest tak obrzydliwe, ale jedyne, które faktycznie działa i to zespół Androida!
Ofek Ron

W jaki sposób uzyskalibyśmy dostęp do ikony wyszukiwania za pomocą tego?
Yasin Yaqoobi

17

Dzięki @CzarMatt dodałem obsługę AndroidX .

Dla mnie następujące prace. Użyłem kodu z linku: Zmień kolor tekstu podpowiedzi wyszukiwania na pasku akcji za pomocą biblioteki wsparcia .

    searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

    EditText txtSearch = ((EditText)searchView.findViewById(androidx.appcompat.R.id.search_src_text));
    txtSearch.setHint(getResources().getString(R.string.search_hint));
    txtSearch.setHintTextColor(Color.LTGRAY);
    txtSearch.setTextColor(Color.WHITE);

Zmiana koloru tekstu podpowiedzi paska akcji w widoku podpowiedzi sugeruje inne rozwiązanie. Działa, ale ustawia tylko tekst i kolor podpowiedzi.

    searchView.setQueryHint(Html.fromHtml("<font color = #ffffff>" + getResources().getString(R.string.search_hint) + "</font>"));

1
Użyj, androidx.appcompat.R.id.search_src_textjeśli przeprowadziłeś migrację projektu do AndroidX.
CzarMatt

16

Najlepiej jest to osiągnąć poprzez niestandardowe style. Przeciąż styl widżetu paska akcji własnym stylem. W przypadku światła holo z ciemnym paskiem akcji umieść to w swoim własnym pliku stylów, takim jak 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>

Upewnij się, że aplikacja używa motywu niestandardowego, zgodnie z opisem w sekcji Wprowadź opis łącza tutaj


14

Możesz to zrobić, ustawiając editTextColoratrybut w stylu.

<style name="SearchViewStyle" parent="Some.Relevant.Parent">
    <item name="android:editTextColor">@color/some_color</item>
</style>

i zastosujesz ten styl do Toolbarlub SearchVieww układzie.

<android.support.v7.widget.Toolbar
    android:theme="@style/SearchViewStyle">

    <android.support.v7.widget.SearchView />

</android.support.v7.widget.Toolbar>

+1 Przeważa to nad wszystkimi rozwiązaniami obejmującymi findViewById imho. Jeśli to możliwe, należy używać stylów widoku.
Mattias,

To powinna być akceptowana odpowiedź! Bardzo czysty i łatwy.
MSeiz5,

8

jeśli używasz - android.support.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);

w Kotlinie

val searchView = SearchView(this)
val editText = searchView.findViewById<EditText>(androidx.appcompat.R.id.search_src_text)
editText.setTextColor(Color.WHITE)

Powinieneś raczej zacząć korzystać z bibliotek obsługujących androidx teraz


7

Stwórz styl dla swojego Toolbar

<style name="AppTheme.Toolbar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="android:editTextColor">@color/some_color</item>
</style>

I ustaw go jako motyw dla Toolbar

<android.support.v7.widget.Toolbar
    android:theme="@style/AppTheme.Toolbar"
    ...

6

Jeśli używasz android.support.v7.widget.SearchView, jest to możliwe bez używania odbicia.

Oto jak robię to w mojej aplikacji:

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

Nie ujawniają identyfikatorów publicznie dla niekompatybilnego z aplikacją SearchView, ale robią to dla AppCompat, jeśli wiesz, gdzie szukać. :)


To działa całkiem dobrze na różnych urządzeniach. Niezłe.
Shark

5

Miałem ten problem i to działa dla mnie.

@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;
}

4
Zawsze otrzymuję wartość null na: (TextView) searchView.findViewById (id);
danielrvt-sgb

4

Jeśli opierasz motyw aplikacji na motywie holo, w SearchView pojawi się biały zamiast czarnego tekst

<style name="Theme.MyTheme" parent="android:Theme.Holo">

Nie znalazłem innego sposobu na zmianę koloru tekstu widoku wyszukiwania bez użycia brudnych hacków.


1
To nie zadziałało. Miałem nadzieję, że tak się stanie, ponieważ jest o wiele czystszy niż ręczne wyszukiwanie „magicznego” identyfikatora widoku. Wypróbowałem kilka motywów z działaniem, którego układ ma ciemne tło, ale żaden z nich nie generował niczego innego niż czarny tekst w SearchView.
E-Riz

4

Najczystszym sposobem jest:

Toolbar używa motywu ThemeOverlay.AppCompat.Dark.Actionbar.

A teraz zrób z tego coś takiego:

toolbarStyle element nadrzędny „ThemeOverlay.AppCompat.Dark.Actionbar”

dodaj ten przedmiot w tym stylu

nazwa elementu "android: editTextColor"> twójkolor

Gotowe.

Jeszcze jedną bardzo ważną rzeczą jest umieszczenie w pasku narzędzi layout_height = "? Attr / actionbarSize". Domyślnie jest to wrap_content, dla mnie tekst nie był nawet widoczny w widoku wyszukiwania, co naprawiło ten problem.


4

Tak, jest to możliwe przy użyciu następującej metody.

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

Wywołanie tej metody wygląda następująco:

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

Używając go, z powodzeniem dodałem czerwony kolor * znak w podpowiedzi za pomocą tej metody. Powinieneś zmienić tę metodę zgodnie z wymaganiami. Mam nadzieję, że to Ci pomoże .... :)


jest to dla mnie trochę skomplikowane.
więzienia

1
String text = "<font color = # 8c8c8c>" + HintMessage + "</font>"; argEditText.setHint (Html.fromHtml (tekst)); możesz również użyć tylko tych dwóch linii kodu do ustawiania wskazówki dotyczącej koloru
DynamicMind

1
SearchAutoComplete autoCompleteView = (SearchAutoComplete) mSearchView .findViewById(com.android.internal.R.id.search_src_text);autoCompleteView.setHintTextColor(R.color.hint_text_color); to moje rozwiązanie, ale myślę, że twoje jest lepsze niż moje, skorzystam z twojego rozwiązania, dziękuję.
więzienia

@gaols czy masz rozwiązanie ..?
DynamicMind

@ gaols, gdzie jest Twój „com.android.internal.R.id.search_src_text”?
wangqi060934

3

Użyj tego, to prawda. :RE

AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
searchText.setHintTextColor(getResources().getColor(color.black));
searchText.setTextColor(getResources().getColor(color.black));

3

Tak możemy,

SearchView searchView = (SearchView) findViewById(R.id.sv_symbol);

Aby zastosować biały kolor dla tekstu SerachView,

int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
TextView textView = (TextView) searchView.findViewById(id);
textView.setTextColor(Color.WHITE);

Miłego kodowania !!!!


3

to działa dla mnie.

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

Zmień kolor wpisanego tekstu:

((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);

Zmień kolor tekstu podpowiedzi:

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

1

SearchViewObiektu rozciąga się od LinearLayout, więc posiada inne poglądy. Sztuczka polega na znalezieniu widoku zawierającego tekst podpowiedzi i programowej zmianie koloru. Problem z próbą znalezienia widoku według identyfikatora polega na tym, że identyfikator jest zależny od motywu używanego w aplikacji. W zależności od użytego motywu findViewById(int id)metoda może powrócić null. Lepszym podejściem, które działa z każdym motywem, jest przejście hierarchii widoków i znalezienie widżetu zawierającego tekst podpowiedzi:

// 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);

Korzystając z tej metody, możesz również zmienić wygląd innych widżetów w SearchViewhierarchii, takich jakEditText wstrzymanie zapytania wyszukiwania. O ile Google nie zdecyduje się SearchViewwkrótce zmienić hierarchii widoku , powinieneś być w stanie zmienić wygląd widżetu tą metodą przez jakiś czas.


1

Możliwe jest dostosowanie widoku wyszukiwania za pomocą biblioteki appcompat v7, ja użyłem biblioteki appcompat v7 i zdefiniowałem dla niej własny styl. W folderze do rysowania umieść plik bottom_border.xml, który wygląda następująco:

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

W folderze wartości 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>

Zdefiniowałem plik custommenu.xml do wyświetlania 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>

Twoja aktywność powinna rozszerzać ActionBarActivity zamiast Activity. Oto metoda onCreateOptionsMenu.

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

W pliku manifestu:

  <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppnewTheme" >

Więcej informacji można znaleźć pod tym adresem URL:
tutaj http://www.jayway.com/2014/06/02/android-theming-the-actionbar/


1

dla paska narzędzi appcompat-v7 z searchView (dostarczonym przez MenuItemCompat):

Ustawienie motywu paska narzędzi na @ style / ThemeOverlay.AppCompat.Light da ciemny kolor (czarny) dla tekstu podpowiedzi i wprowadzonego tekstu, ale nie wpłynie na kolor kursora *. Odpowiednio, ustawienie motywu paska narzędzi na @ style / ThemeOverlay.AppCompat.Dark da jasny kolor (biały) dla tekstu podpowiedzi i wprowadzonego tekstu, kursor * i tak będzie biały.

Dostosowywanie powyższych motywów:

android: textColorPrimary -> kolor wpisanego tekstu

editTextColor -> kolor wpisanego tekstu (nadpisuje wpływ android: textColorPrimary jeśli jest ustawiony)

android: textColorHint -> kolor podpowiedzi

* uwaga: Jeszcze nie ustaliłem, w jaki sposób można kontrolować kolor kursora (bez użycia roztworu odbicia).


Kolor kursora pochodzi z colorControlActivated
Henry

1

Dzięki temu mogłem zmienić wpisany kolorowy tekst w widoku wyszukiwania

AutoCompleteTextView typed_text = (AutoCompleteTextView) inputSearch.findViewById(inputSearch.getContext().getResources().getIdentifier("android:id/search_src_text", null, null));
typed_text.setTextColor(Color.WHITE);

1

Łał. Wiele odpowiedzi. Pobiera wartość koloru z twojego podstawowego koloru.

Zmień to i gotowe!

@Override
public void onResume() {
    super.onResume();
    getActivity().setTheme(R.style.YourTheme_Searching);
}

Style;

<style name="YourTheme.Searching" parent="YourTheme">
    <item name="android:textColorPrimary">@android:color/white</item>
</style>

1

zmień styl wyszukiwania w pasku narzędzi za pomocą androidx.

po pierwsze, ustaw styl widoku wyszukiwania w stylu paska narzędzi (zmień je nadrzędnymi za pomocą własnej aplikacji):

     <!-- toolbar style -->
      <style name="ToolbarStyle" parent="Theme.AppCompat.Light.NoActionBar">     
          <!-- search view about -->
          <item name="android:editTextColor">@color/colorWhitePrimaryText</item>
          <item name="android:textColorHint">@color/colorWhiteSecondaryText</item>
          <item name="android:textCursorDrawable">@drawable/drawable_cursor_white</item>
          <item name="closeIcon">@mipmap/ic_close</item>
          <item name="searchHintIcon">@mipmap/ic_search_white</item>
          <item name="searchIcon">@mipmap/ic_search_white</item>
          <item name="android:longClickable">false</item>
          <item name="android:queryHint">@string/toolbar_search</item>
      </style> 

następnie użyj go w układzie paska narzędzi:

android:theme="@style/ToolbarStyle"

dzięki temu możesz zmienić większość stylów searchView z wyjątkiem podpowiedzi do zapytania.

na koniec ustaw podpowiedź do zapytania w opcjach menu paska narzędzi:

toolbar.setOnMenuItemClickListener(item -> {
        switch (item.getItemId()){
            case R.id.toolbar_search:
                SearchView searchView = (SearchView) item.getActionView();
                searchView.setQueryHint("default query");
                searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                    @Override
                    public boolean onQueryTextSubmit(String query) {
                        return false;
                    }

                    @Override
                    public boolean onQueryTextChange(String newText) {
                        return false;
                    }
                });
                return true;
                default:
                    return false;
        }

Czy chodziło Ci o opublikowanie czegoś w stylu „searchView”?
DavidW

Ukończyłem i uprościłem moje rozwiązanie, może ci pomoże.
user2333

1

Możesz zastąpić domyślny kolor za pomocą android:theme atrybutu w Widoku.

Jeśli używasz Toolbarlub MaterialToolbar:

<com.google.android.material.appbar.MaterialToolbar
    android:theme="@style/ThemeOverlay.Toobar"
    ...>

lub:

<androidx.appcompat.widget.Toolbar
    android:theme="@style/ThemeOverlay.Toobar"
    ...>

gdzie motyw nakładki z rozszerzeniem motywem komponentów materiałów to:

<style name="ThemeOverlay.Toobar" parent="ThemeOverlay.MaterialComponents.Toolbar.Primary">
    <!-- Text color -->
    <item name="android:editTextColor">@color/....</item>
    <!-- Hint text color -->
    <item name="android:textColorHint">@color/...</item>
</style>

z motywem AppCompat:

<style name="ThemeOverlay.Toobar" parent="ThemeOverlay.AppCompat.Light.*">
    <!-- Text color -->
    <item name="android:editTextColor">@color/....</item>
    <!-- Hint text color -->
    <item name="android:textColorHint">@color/...</item>
</style>

wprowadź opis obrazu tutaj


Jeśli używasz SearchView w swoim układzie znaku, możesz zrobić coś podobnego:

   <androidx.appcompat.widget.SearchView
       android:theme="@style/ThemeOverlay.SearchView"

z

   <style name="ThemeOverlay.SearchView" parent="">
        <!-- Text color -->
        <item name="android:editTextColor">@color/...</item>
        <!-- Hint text color -->
        <item name="android:textColorHint">@color/...</item>
    </style>

wprowadź opis obrazu tutaj


0
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);

Używam biblioteki Holoeverywhere. Zwróć uwagę na org.holoeverywhere.R.id.search_src_text


0

Znalazłem rozwiązanie z posta na blogu. Zobacz tutaj .

Zasadniczo stylizujesz searchViewAutoCompleteTextView i masz android: actionBarWidgetTheme dziedziczy styl.


0

to działa ze mną

@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

Co mi pomogło

((EditText)searchView.findViewById(R.id.search_src_text)).setTextColor(getResources().getColor(R.color.text));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.