it-roy-ru.com

Изменение текста и подсказок в приложении SearchView

Кто-нибудь знает, как изменить цвет текста appcompat SearchView? Я потратил 2 часа и попробовал несколько предложений от SO, но ни одно из них не работает.

Вот мой код:

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

И в моей деятельности у меня есть это:

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

Объект SearchView происходит от LinearLayout, поэтому он содержит другие представления. Хитрость заключается в том, чтобы найти представление, содержащее текст подсказки, и программно изменить цвет. Обходя иерархию представления, вы можете найти виджет, содержащий текст подсказки:

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

Этот метод работает с любой темой. Кроме того, вы можете изменить внешний вид других виджетов в иерархии SearchView, например EditText, содержащего поисковый запрос.

8
jfcartier

Ни один из ответов не сработал для меня. В конечном итоге сработала установка темы на панели инструментов и указание там textColorHint.

Тема (в файле styles.xml):

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

Панель инструментов (в любом макете) :

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

Это работает, потому что когда вы устанавливаете тему в ViewGroup, ее атрибуты также применяются ко всем дочерним представлениям ViewGroup. Это одно из различий между темой и стилем :)

7
Saket

Можно настроить searchview с помощью библиотеки appcompat v7. Я использовал библиотеку appcompat v7 и определил для нее собственный стиль . В папке drawable поместите файл bottom_border.xml, который выглядит так:

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

В папке значений 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>

Я определил файл custommenu.xml для отображения меню:

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

Ваша активность должна расширять ActionBarActivity вместо Activity . Вот метод 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);
  }

В файле манифеста:

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

Для получения дополнительной информации см. Этот URL:
Здесь http://www.jayway.com/2014/06/02/Android-theming-the-actionbar/

3
Suhas Patil

Другое решение:

 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

Изменить стиль SearchView в Appcompat v21

1) Создайте файл конфигурации для поиска. Этот файл традиционно называется searchable.xml и должен быть сохранен в каталоге 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) Добавьте метаданные и атрибут к своей деятельности и действию в фильтр намерений в 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) Создание стилей для индикатора, иконок, подсказок и цветов текста.

<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) Добавьте Widget.App.Search в BaseAppTheme, добавленный в AndroidManifest в качестве стиля деятельности

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

Добавьте ActionBarThemeOverlay на инициализацию своей панели инструментов

<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