Как я могу стилизовать SearchView при использовании панели инструментов в качестве панели действий?

21

Я использую Toolbar в качестве панели действий в своем приложении, используя библиотеку AppCompat v21, как описано в этот пост в блоге разработчиков Android. Я разработал панель действий, используя тему ThemeOverlay.AppCompat.Dark.ActionBar , чтобы текст был светлым. Тем не менее, я хочу, чтобы всплывающее окно Action Bar SearchView отображало темный текст на светлом фоне, и я не смог добиться этого эффекта.

Вот XML для моей панели действий Toolbar :

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar_actionbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:elevation="@dimen/action_bar_elevation"
    app:theme="@style/ActionBarThemeOverlay"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 

Я попытался расширить наложение темы темы Action Bar на стиль SearchView :

<style name="ActionBarThemeOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="searchViewStyle">@style/Widget.AppCompat.Light.SearchView</item>
</style>

Я добавил этот же элемент в свою основную тему для хорошей меры:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="searchViewStyle">@style/Widget.AppCompat.Light.SearchView</item>
</style>

Но элементы searchViewStyle , похоже, не имеют никакого эффекта. Как я могу создать SearchView здесь?

    
задан Ben 19.01.2015 в 04:05
источник
  • Как я могу изменить цвет bg searchview при расширении.? Есть ли свойство стиля для этого или я должен использовать код? –  Bibin Velayudhan 30.03.2017 в 07:52
  • Извините, я не знаю ответа на этот вопрос; это было какое-то время, так как я работал над этим. –  Ben 31.03.2017 в 03:06
  • Все в порядке. Выясните это. Спасибо..! –  Bibin Velayudhan 03.04.2017 в 13:41

3 ответа

9

Покопавшись в исходный код и немного экспериментировав, я придумал решение и выяснил пару источников путаницы. Во-первых, стиль SearchView должен быть установлен в теме приложения:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="searchViewStyle">@style/MySearchViewStyle</item>
</style>

Затем нам нужно установить suggestionRowLayout в searchViewStyle :

<style name="MySearchViewStyle" parent="Widget.AppCompat.Light.SearchView">
    <item name="suggestionRowLayout">@layout/search_suggestion_row</item>
</style>

В моем вопросе я предположил, что мы можем использовать @style/Widget.AppCompat.Light.SearchView , чтобы получить меню с легким предложением, но, оказывается, это не так; нам нужно определить наш собственный макет. Я основывался на abc_search_dropdown_item_icons_2line.xml от библиотеки AppCompat v21.

    
ответ дан Ben 20.01.2015 в 04:53
  • Привет @Ben, я добавил стиль MySearchViewStyle и установил кнопку закрытия, кнопку голосового поиска и предложенияRowLayout и установил этот стиль как searchViewStyle в теме приложения, как вы предлагали, но searchview не использует этот стиль. Я использую панель инструментов с темой, установленной в ThemeOverlay.AppCompat.Dark.ActionBar. Не могли бы вы сообщить мне, если я что-то упустил, я прочитал все блоги об этом, конечно, я делаю что-то неправильно! –  Rahul Sainani 14.08.2015 в 12:01
  • @droidster Извините, прошло некоторое время с тех пор, как я посмотрел на это, и я до сих пор не уверен, было ли мое решение наилучшим подходом, поэтому я, вероятно, не самый лучший человек. Похоже, это, вероятно, стоит открыть новый вопрос. Удачи! –  Ben 15.08.2015 в 04:10
  • Не беспокойтесь. Я смог разобраться. Просто нужно было установить тему приложения в макете панели инструментов. Благодаря! Этот пост помог мне. –  Rahul Sainani 22.08.2015 в 15:11
  • Я работаю при использовании android.support.v7.widget.SearchView, а не android.widget.SearchView. –  horkavlna 16.11.2015 в 13:31
36

В соответствии с записью в блоге объявления AppCompat v21 :

AppCompat предлагает обновленный API SearchView от Lollipop, который намного более настраиваемый и настраиваемый (очередь аплодисментов). Теперь мы используем структуру стиля Lollipop вместо старых атрибутов темы searchView *.

Вот как вы создаете SearchView (в values/themes.xml ):

<style name="Theme.MyTheme" parent="Theme.AppCompat">
   <item name="searchViewStyle">@style/MySearchViewStyle</item>
</style>
<style name="MySearchViewStyle" parent="Widget.AppCompat.SearchView">
   <!-- Background for the search query section (e.g. EditText) -->
   <item name="queryBackground">...</item>
   <!-- Background for the actions section (e.g. voice, submit) -->
   <item name="submitBackground">...</item>
   <!-- Close button icon -->
   <item name="closeIcon">...</item>
   <!-- Search button icon -->
   <item name="searchIcon">...</item>
   <!-- Go/commit button icon -->
   <item name="goIcon">...</item>
   <!-- Voice search button icon -->
   <item name="voiceIcon">...</item>
   <!-- Commit icon shown in the query suggestion row -->
   <item name="commitIcon">...</item>
   <!-- Layout for query suggestion rows -->
   <item name="suggestionRowLayout">...</item>
</style>

Как далее исследовано в этом сообщении в блоге .

    
ответ дан ianhanniballake 19.01.2015 в 06:28
  • Спасибо! Это маршрут, который я принимал, но, оказывается, меня смутило несколько вещей, как я опишу в своем ответе. –  Ben 20.01.2015 в 05:01
  • suggestionRowLayout, похоже, не работает –  Michał K 06.05.2015 в 11:27
  • @ MichałK - он работает здесь. Не стесняйтесь задавать вопрос со всеми вашими подробностями! –  ianhanniballake 06.05.2015 в 20:03
  • ОК, мне нужно было использовать <item name="searchViewStyle"> вместо <item name="android: searchViewStyle"> в моей теме, теперь это работает. –  Denis Kniazhev 25.02.2016 в 12:38
  • @shekar - весь AppCompat, включенный в эту тематику, работает до API 7 –  ianhanniballake 15.07.2016 в 15:06
Показать остальные комментарии
1

Вот пример search_suggestion_row.xml

    <?xml version="1.0" encoding="utf-8"?>
<!--
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-->

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="58dip"
                style="@style/RtlOverlay.Widget.AppCompat.Search.DropDown">

    <!-- Icons come first in the layout, since their placement doesn't depend on
         the placement of the text views. -->
    <android.support.v7.internal.widget.TintImageView
               android:id="@android:id/icon1"
               android:layout_width="@dimen/abc_dropdownitem_icon_width"
               android:layout_height="48dip"
               android:scaleType="centerInside"
               android:layout_alignParentTop="true"
               android:layout_alignParentBottom="true"
               android:visibility="invisible"
               style="@style/RtlOverlay.Widget.AppCompat.Search.DropDown.Icon1" />

    <android.support.v7.internal.widget.TintImageView
               android:id="@+id/edit_query"
               android:layout_width="48dip"
               android:layout_height="48dip"
               android:scaleType="centerInside"
               android:layout_alignParentTop="true"
               android:layout_alignParentBottom="true"
               android:background="?attr/selectableItemBackground"
               android:visibility="gone"
               style="@style/RtlOverlay.Widget.AppCompat.Search.DropDown.Query" />

    <android.support.v7.internal.widget.TintImageView
               android:id="@id/android:icon2"
               android:layout_width="48dip"
               android:layout_height="48dip"
               android:scaleType="centerInside"
               android:layout_alignWithParentIfMissing="true"
               android:layout_alignParentTop="true"
               android:layout_alignParentBottom="true"
               android:visibility="gone"
               style="@style/RtlOverlay.Widget.AppCompat.Search.DropDown.Icon2" />


    <!-- The subtitle comes before the title, since the height of the title depends on whether the
         subtitle is visible or gone. -->
    <TextView android:id="@android:id/text2"
              style="?android:attr/dropDownItemStyle"
              android:textAppearance="?attr/textAppearanceSearchResultSubtitle"
              android:singleLine="true"
              android:layout_width="match_parent"
              android:layout_height="29dip"
              android:paddingBottom="4dip"
              android:gravity="top"
              android:layout_alignWithParentIfMissing="true"
              android:layout_alignParentBottom="true"
              android:visibility="gone" />

    <!-- The title is placed above the subtitle, if there is one. If there is no
         subtitle, it fills the parent. -->
    <TextView android:id="@android:id/text1"
              style="?android:attr/dropDownItemStyle"
              android:textAppearance="?attr/textAppearanceSearchResultTitle"
              android:singleLine="true"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_centerVertical="true"
              android:layout_above="@android:id/text2" />

</RelativeLayout>
<!-- From: file:/usr/local/google/buildbot/repo_clients/https___googleplex-android.googlesource.com_a_platform_manifest.git/lmp-mr1-supportlib-release/frameworks/support/v7/appcompat/res/layout/abc_search_dropdown_item_icons_2line.xml -->
    
ответ дан awsleiman 22.01.2016 в 14:42