personalizar - paletas de colores android studio
¿Cómo puedo diseñar el SearchView cuando uso una barra de herramientas como una barra de acción? (4)
Después de profundizar en el código fuente y experimentar un poco, encontré una solución y aclaré un par de fuentes de confusión. Primero, el estilo SearchView
debe configurar en el tema de la aplicación:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="searchViewStyle">@style/MySearchViewStyle</item>
</style>
Entonces necesitamos establecer el suggestionRowLayout
en el searchViewStyle
:
<style name="MySearchViewStyle" parent="Widget.AppCompat.Light.SearchView">
<item name="suggestionRowLayout">@layout/search_suggestion_row</item>
</style>
En mi pregunta, asumí que podríamos usar @style/Widget.AppCompat.Light.SearchView
para obtener un menú de sugerencias ligero, pero resulta que este no es el caso; Necesitamos definir nuestro propio diseño. abc_search_dropdown_item_icons_2line.xml
el mío en abc_search_dropdown_item_icons_2line.xml
de la biblioteca AppCompat v21.
Estoy usando una Toolbar
como una barra de acción en mi aplicación usando la biblioteca AppCompat v21, como se describe en esta publicación en el Blog de desarrolladores de Android. He diseñado la barra de acciones con el tema ThemeOverlay.AppCompat.Dark.ActionBar
para que el texto sea claro. Sin embargo, me gustaría que la ventana de sugerencias de búsqueda emergente de la barra de acción muestre texto oscuro sobre un fondo claro, y no he podido lograr este efecto.
Aquí está el XML para mi barra de Toolbar
barra de acción:
<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"/>
He intentado extender la superposición del tema de la barra de acción para SearchView
:
<style name="ActionBarThemeOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="searchViewStyle">@style/Widget.AppCompat.Light.SearchView</item>
</style>
He añadido este mismo elemento a mi tema principal para una buena medida:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="searchViewStyle">@style/Widget.AppCompat.Light.SearchView</item>
</style>
Pero los elementos searchViewStyle
no parecen tener ningún efecto. ¿Cómo puedo SearchView
el SearchView
aquí?
Según la publicación del blog de AppCompat v21 :
AppCompat ofrece la API SearchView actualizada de Lollipop, que es mucho más personalizable y con estilo (poner en cola el aplauso). Ahora usamos la estructura de estilo Lollipop en lugar de los antiguos atributos del tema searchView *.
Así es como values/themes.xml
(en 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>
Como más investigado en esta entrada de blog .
Si no funciona, puedes codificarlo. Te lo explico en este post. Es para las formas de xamarin, pero espero que pueda aplicarlo a un nativo en el mundo. Puede cambiar el fondo, el icono, el icono claro y el color.
Cómo cambiar la imagen del botón cancelar en la barra de búsqueda en formularios xamarin
Aquí hay un ejemplo de 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 -->