it-swarm.com.de

Ändern Sie den SearchView-Text und die Hinweisfarbe von appcompat

Weiß jemand, wie man die Textfarbe des appcompat SearchView ändert? Ich habe 2 Stunden verbracht und einige Vorschläge von SO ausprobiert und keiner funktioniert.

Hier ist mein Code:

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

Und in meiner Tätigkeit habe ich folgendes:

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);
}
19
danielrvt-sgb
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
41
camanjj

Ein SearchView-Objekt erstreckt sich von LinearLayout, sodass es andere Ansichten enthält. Der Trick besteht darin, die Ansicht mit dem Hinweistext zu finden und die Farbe programmgesteuert zu ändern. Durch das Durchlaufen der Ansichtshierarchie können Sie das Widget mit dem Hinweistext 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);

Diese Methode funktioniert mit jedem Thema. Sie können auch das Aussehen anderer Widgets in der SearchView-Hierarchie ändern, z. B. die EditText, die die Suchabfrage enthält.

8
jfcartier

Keine der Antworten funktionierte für mich. Was schließlich funktioniert hat, war das Festlegen eines Themas in der Symbolleiste und das Festlegen der textColorHint-Datei.

Theme (in styles.xml):

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

Symbolleiste (in beliebigem Layout) :

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

Dies funktioniert, weil beim Festlegen eines Designs für eine ViewGroup dessen Attribute auch auf alle untergeordneten Ansichten der ViewGroup angewendet werden. Dies ist einer der Unterschiede zwischen einem Thema und einem Stil :)

7
Saket

Es ist möglich, die Suchansicht mithilfe der Bibliothek von appcompat v7 anzupassen. Ich habe die Bibliothek von appcompat v7 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/

3
Suhas Patil

Eine andere Lösung:

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

Ändern Sie den Stil von SearchView in Appcompat v21

1) Erstellen Sie eine erreichbare Konfigurationsdatei. Diese Datei hat üblicherweise den Namen searchable.xml und muss im Verzeichnis res/xml/project gespeichert werden.

<?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) Fügen Sie Metadaten und Attribute zu Ihrer Aktivität und Aktion hinzu, um den Intent-Filter in AndroidManifest.xml durchzuführen

<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) Erstellen Sie Stile für Indikator-, Symbol-, Hinweis- und Textfarben.

<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) Fügen Sie Widget.App.Search zu BaseAppTheme hinzu, das in AndroidManifest als Aktivitätsstil hinzugefügt wurde

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

Fügen Sie ActionBarThemeOverlay der Initalisierung der Symbolleiste hinzu

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