2013-08-15 9 views
19

Czy ktoś wie, jak zmienić kolor tekstu aplikacji SearchView? Spędziłem 2 godziny i wypróbowałem kilka sugestii z SO i żaden z nich nie działa.Zmień wygląd aplikacji AppView na tekst i kolor podpowiedzi

Oto mój kod:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:espacios="http://schemas.android.com/apk/res-auto" > 

    <item 
     android:id="@+id/layer_switcher_button" 
     android:icon="@drawable/b_categorias" 
     android:title="@string/menu_layer_switcher_title" 
     espacios:showAsAction="ifRoom|collapseActionView"/> 
    <item 
     android:id="@+id/action_search" 
     android:icon="@drawable/b_buscar" 
     android:title="@string/menu_search_title" 
     espacios:actionViewClass="android.support.v7.widget.SearchView" 
     espacios:showAsAction="ifRoom|collapseActionView"/> 

</menu> 

A w mojej działalności mam to:

public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 

    menuItem layerSwitcher = menu.findItem(R.id.layer_switcher_button); 
    layerSwitcher.setOnMenuItemClickListener(new OnMenuItemClickListener() { 

     @Override 
     public boolean onMenuItemClick(MenuItem item) { 
     onLayerSwitcherButtonClicked(); 
      return false; 
     } 
    }); 

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

    LinearLayout ll = (LinearLayout) searchView.getChildAt(0); 
    TextView textView = (TextView) ll.getChildAt(0); 

    textView.setTextColor(R.color.white); 
} 
+0

Próbowałaś użyciu SearchableInfo? –

Odpowiedz

41
SearchView searchView = new SearchView(getContext()); 
SearchView.SearchAutoComplete theTextArea = (SearchView.SearchAutoComplete)searchView.findViewById(R.id.search_src_text); 
theTextArea.setTextColor(Color.WHITE);//or any color that you want 
+4

Używanie 'android.support.v7.appcompat.R.id.search_src_text' działa w porównaniu z użyciem' R.id.search_src_text': http://stackoverflow.com/a/18813109/950427 –

+1

@Jared Burrows Twój dodatek był pomocny! –

7

SearchView obiektu rozciąga się od LinearLayout, więc posiada inne poglądy. Sztuką jest znalezienie widoku zawierającego tekst podpowiedzi i programową zmianę koloru. Przez przejeżdżające hierarchię widoku można znaleźć widżet zawierający 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); 

Ta metoda działa z każdym tematem. Można również zmienić wygląd innych widżetów w hierarchii SearchView, takich jak EditText, zawierających zapytanie wyszukiwania.

+0

hej JfCartier, miejmy nadzieję, że możesz odpowiedzieć, chodzi o to, że ostatnie dziecko dostaje się (autouzupełnianie ..) pojawia się jako .... SearchView $ typ SearchAutoComplete ... którego nie można odrzucić do normalnego ... SearchView. SearchAutoComplete ... (co oznaczają te znaki dolara? –

+0

Znak dolara oznacza, że ​​jest to wewnętrzna klasa, więc jest to naprawdę SearchView.SearchAutoComplete.Jakie błędy otrzymujesz? – jfcartier

+0

cóż, to po prostu nie będzie rzucać do autouzupełniania wyszukiwania .. stanie Aby obsłużyć itp. ...! tak jakby był to inny obiekt! –

3

Istnieje możliwość dostosowania widoku wyszukiwania przy użyciu biblioteki appcompat v7. Użyłem biblioteki appcompat v7 i zdefiniowałem dla niej niestandardowy styl. W rozciągliwej folderze umieścić bottom_border.xml plik, który wygląda tak:

<?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 wartościach folderu 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> 

I zdefiniowany plik custommenu.xml do menu Wyświetlenie

<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 rozszerzyć 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" > 

Aby uzyskać więcej informacji, zobacz ten link:
Tutaj http://www.jayway.com/2014/06/02/android-theming-the-actionbar/

+0

Edytowanie wyszukiwaniaViewTextField nie zadziałało dla mnie –

0

Zmień styl SearchView w AppCompat V21

1) Tworzenie seachable konfigurację plik. Plik ten jest tradycyjnie nazywany searchable.xml i musi być zapisany w katalogu res/xml/project.

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:label="@string/app_label" 
    android:hint="@string/search_hint" > 
</searchable> 

2) Dodaj metadane i przypisać do swojej działalności i działań do intent-filter w AndroidManifest.xml

<activity 
     android:name=".activity.YourActivity" 
     android:screenOrientation="portrait" 
     android:theme="@style/Theme.App.Base"> 
     <meta-data android:name="android.app.searchable" 
        android:resource="@xml/searchable"/> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 
    </activity> 

3) Tworzenie stylów wskaźnika, ikony, podpowiedź i tekstowych kolorach.

<style name="ActionBarThemeOverlay" parent=""> 
     <item name="android:textColorPrimary">@color/action_bar_text</item> 
     <item name="colorControlNormal">@color/action_bar_text</item> 
     <item name="colorControlHighlight">@color/body_text_2</item> 
    </style> 

<style name="Widget.App.SearchView" parent="Widget.AppCompat.Light.SearchView"> 
    <item name="closeIcon">@drawable/ic_action_cancel</item> 
    <item name="voiceIcon">@drawable/ic_action_voice</item> 
</style> 

4) Dodaj Widget.App.Szukaj na BaseAppTheme dodane AndroidManifest jako aktywność stylu

<style name="Theme.App.Base" parent="Theme"> 
    name="searchViewStyle">@style/Widget.App.SearchView</item> 
</style> 

Dodaj ActionBarThemeOverlay do paska narzędzi initalization

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar_actionbar" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/toolbar_height" 
    android:background="@color/color_primary" 
    app:theme="@style/ActionBarThemeOverlay" 
    app:popupTheme="@style/ActionBarPopupThemeOverlay" 
    app:subtitleTextAppearance="@style/Theme.ActionBar.SubtitleTextStyle" 
    app:titleTextAppearance="@style/Theme.ActionBar.TitleTextStyle"/> 
+0

To jeden świetny sposób na uzyskanie motywu SearchView. Po prostu utwórz styl i zastosuj go na pasku narzędzi! Pracował jak urok! – sud007

5

żadna z odpowiedzi pracował dla mnie. To, co ostatecznie działało, to ustawienie motywu na pasku narzędzi i określenie tam textColorHint.

Theme (w styles.xml):

<style name="ToolbarTheme"> 
    <item name="android:textColorHint">@color/white_opacity_60</item> 
</style> 

Toolbar (w dowolnym układzie):

<android.support.v7.widget.Toolbar 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/ToolbarTheme" /> 

To działa, ponieważ po ustawieniu motywu do ViewGroup, jej atrybuty są również stosowane do wszystkich widoków podrzędnych grupy ViewGroup. Jest to jedna z różnic między tematu i stylu :)

0

Innym rozwiązaniem:

searchView_SA = (SearchView) findViewById(R.id.searcvViewSA); 
EditText searchEditText = (EditText)searchView_SA.findViewById(android.support.v7.appcompat.R.id.search_src_text); 
    searchEditText.setTextColor(getResources().getColor(R.color.black)); 
    searchEditText.setHintTextColor(getResources().getColor(R.color.black)); 
Powiązane problemy