Estoy tratando de cambiar el dibujo que se encuentra en el widget de vista de búsqueda de la barra de acción de Android.
Actualmente se ve así:
pero necesito cambiar el fondo azul dibujable a rojo.
He intentado muchas cosas antes de lanzar mi propio widget de búsqueda, pero nada parece funcionar.
¿Alguien puede señalarme en la dirección correcta para cambiar esto?
SearchView
fondo porque no está disponible a través deR.styleable
. Mi respuesta a continuación describe cómo hacerlo en código.Respuestas:
Introducción
Desafortunadamente, no hay forma de establecer el
SearchView
estilo de campo de texto usando temas, estilos y herencia en XML, como puede hacer con el fondo de los elementos en el menú desplegable de ActionBar . Esto se debe a queselectableItemBackground
está catalogado como styleable enR.stylable
, mientras quesearchViewTextField
(atributo tema que nos interesa) no lo es. Por lo tanto, no podemos acceder fácilmente desde los recursos XML (obtendrá unNo resource found that matches the given name: attr 'android:searchViewTextField'
error).Establecer el fondo del campo de texto SearchView desde el código
Por lo tanto, la única forma de sustituir adecuadamente el fondo del
SearchView
campo de texto es entrar en sus componentes internos, obtener acceso a la vista que tiene un fondo establecidosearchViewTextField
y establecer el nuestro.NOTA: La solución a continuación depende solo de la identificación (
android:id/search_plate
) del elemento internoSearchView
, por lo que es más independiente de la versión del SDK que el recorrido secundario (por ejemplo,searchView.getChildAt(0)
para obtener la vista correcta internaSearchView
), pero no es a prueba de balas. Especialmente si algún fabricante decide volver a implementarSearchView
elementos internos y el elemento con la identificación mencionada anteriormente no está presente, el código no funcionará.En SDK, el fondo para el campo de texto
SearchView
se declara a través de nueve parches , por lo que lo haremos de la misma manera. Puede encontrar imágenes png originales en el directorio drawable-mdpi del repositorio git de Android . Estamos interesados en dos imágenes. Uno para el estado cuando el campo de texto está seleccionado (llamado textfield_search_selected_holo_light.9.png ) y otro para donde no está (llamado textfield_search_default_holo_light.9.png ).Desafortunadamente, tendrá que crear copias locales de ambas imágenes, incluso si desea personalizar solo el estado enfocado . Esto se debe a
textfield_search_default_holo_light
que no está presente en R.drawable . Por lo tanto, no se puede acceder fácilmente a través de él@android:drawable/textfield_search_default_holo_light
, que podría usarse en el selector que se muestra a continuación, en lugar de hacer referencia al dibujo local.NOTA: Estaba usando el tema Holo Light como base, pero puedes hacer lo mismo con Holo Dark . Parece que no hay una diferencia real en el estado seleccionado de 9 parches entre los temas claros y oscuros . Sin embargo, hay una diferencia en 9 parches para el estado predeterminado (ver Claro vs Oscuro ). Por lo tanto, probablemente no sea necesario hacer copias locales de 9 parches para el estado seleccionado , tanto para temas oscuros como claros (suponiendo que desee manejar ambos, y hacer que ambos se vean igual que en Holo Theme ). Simplemente haga una copia local y úsela enselector extraíble para ambos temas.
Ahora, deberá editar los nueve parches descargados según sus necesidades (es decir, cambiar el color azul a rojo). Puede echar un vistazo al archivo con la herramienta de dibujar 9 parches para verificar si está correctamente definido después de su edición.
He editado archivos usando GIMP con la herramienta de lápiz de un píxel (bastante fácil) pero probablemente usará la herramienta propia. Aquí está mi parche personalizado de 9 para el estado enfocado :
NOTA: Para simplificar, solo he usado imágenes para densidad mdpi . Tendrá que crear 9 parches para múltiples densidades de pantalla si desea el mejor resultado en cualquier dispositivo. Las imágenes para Holo
SearchView
se pueden encontrar en mdpi , hdpi y xhdpi dibujables .Ahora, necesitaremos crear un selector dibujable, para que se muestre la imagen adecuada según el estado de la vista. Crear archivo
res/drawable/texfield_searchview_holo_light.xml
con el siguiente contenido:Utilizaremos el dibujo creado anteriormente para establecer el fondo para la
LinearLayout
vista que contiene el campo de texto dentroSearchView
; su id esandroid:id/search_plate
. Así que aquí está cómo hacer esto rápidamente en el código, al crear el menú de opciones:Efecto final
Aquí está la captura de pantalla del resultado final:
Como llegué a esto
Creo que vale la pena mencionar cómo llegué a esto, para que este enfoque se pueda utilizar al personalizar otras vistas.
Verificando el diseño de la vista
He comprobado cómo se
SearchView
ve el diseño. En SearchView contructor se puede encontrar una línea que infla el diseño:Ahora sabemos que el
SearchView
diseño está en el archivo llamadores/layout/search_view.xml
. Mirando en search_view.xml podemos encontrar unLinearLayout
elemento interno (con idsearch_plate
) que tieneandroid.widget.SearchView$SearchAutoComplete
dentro (se parece al campo de texto de nuestra vista de búsqueda):Ahora, ahora que el fondo se establece en función del
searchViewTextField
atributo del tema actual .Atributo de investigación (¿es fácilmente configurable?)
Para verificar cómo
searchViewTextField
se establece el atributo, investigamos res / values / themes.xml . Hay un grupo de atributos relacionados porSearchView
defectoTheme
:Vemos que para el tema predeterminado el valor es
@drawable/textfield_searchview_holo_dark
. ElTheme.Light
valor también se establece en ese archivo .Ahora, sería genial si este atributo fuera accesible a través de R.styleable , pero desafortunadamente no lo es. A modo de comparación, ver otros temáticos atributos que están presentes tanto en themes.xml y R.attr como textAppearance o selectableItemBackground . Si
searchViewTextField
estuviera presente enR.attr
(yR.stylable
) podríamos simplemente usar nuestro selector dibujable al definir el tema para toda nuestra aplicación en XML. Por ejemplo:¿Qué se debe modificar?
Ahora sabemos que tendremos que acceder a
search_plate
través del código. Sin embargo, todavía no sabemos cómo debería ser. En resumen, buscamos elementos dibujables utilizados como valores en los temas predeterminados: textfield_searchview_holo_dark.xml y textfield_searchview_holo_light.xml . Al observar el contenido, vemos que el elemento dibujable es elselector
que hace referencia a otros dos elementos dibujables (que resultan ser 9 parches más adelante) según el estado de visualización. Puede encontrar elementos dibujables agregados de 9 parches de (casi) todas las versiones de Android en androiddrawables.comPersonalización
Reconocemos la línea azul en uno de los 9 parches , por lo que creamos una copia local y cambiamos los colores según lo desee.
fuente
SearchView
sí mismo). ¿Está bien si fusiono tu respuesta (anulando onCreateOptionsMenu) en la mía?onCreate()
método a otroonCreateOptionsMenu()
como usted sugirió. Votó su respuesta.Es posible que las soluciones anteriores no funcionen si está utilizando la biblioteca appcompat. Es posible que deba modificar el código para que funcione para la biblioteca appcompat.
Aquí está la solución de trabajo para la biblioteca appcompat.
fuente
Tu
onCreateOptionsMenu
método debe ser:donde su elemento de búsqueda está
menu_search
fuera de cursoy aquí está
searchviewredversion
(esta es la versión xhdpi): http://img836.imageshack.us/img836/5964/searchviewredversion.pngfuente
La solución anterior no funciona con ActionBarSherlock 4.2 y, por lo tanto, no es compatible con versiones anteriores de Android 2.x. Aquí hay un código de trabajo que configura el fondo de SearchView y el texto de sugerencia en ActionBarSherlock 4.2:
fuente
También me cansé de hacer esto y estoy usando v7. La aplicación se bloqueó cuando intenté tomar la
searchPlate
vía,getIdentifier()
así que lo hice de esta manera:fuente
También enfrenté el mismo problema. Utilicé la biblioteca appcompat v7 y definí un estilo personalizado. En la carpeta dibujable, coloque el archivo bottom_border.xml que se ve así:
En la carpeta de valores styles_myactionbartheme.xml:
Definí el archivo custommenu.xml para mostrar el menú:
Su actividad debe extender ActionBarActivity en lugar de Activity.
En archivo de manifiesto:
Para obtener más información, consulte aquí:
aquí http://www.jayway.com/2014/06/02/android-theming-the-actionbar/
fuente
Actualizar
Si está utilizando AndroidX, puede hacerlo así
fuente
Primero, creemos un archivo XML llamado search_widget_background.xml, para usar como un elemento de dibujo, es decir, en un directorio de dibujo.
Este dibujo se utilizará como fondo para nuestro widget de búsqueda. Establecí el color en rojo porque eso es lo que pediste, pero puedes configurarlo en cualquier color definido por la etiqueta @color. Incluso puede modificarlo aún más utilizando los atributos definidos para la etiqueta de forma (hacer esquinas redondeadas, hacer un fondo ovalado, etc.).
El siguiente paso es establecer el fondo de nuestro widget de búsqueda en este. Esto se puede lograr de la siguiente manera:
fuente
SearchView
(con nombresearch_plate
), no enSearchView
sí mismo. Vea mi respuesta para más detalles. Sin embargo, debo admitir que no he tratado de usar la respuesta de @ (baba tenor).SearchView
sí mismo siempre estará debajo del fondo para los elementos que están dentroSearchView
. Hay unaLinearLayout
vista dentroSearchView
que tiene idsearch_plate
, que establece tiene este elemento de subrayado azul como fondo. Vea mi respuesta para más detalles. Entonces, con su solución, el resultado es un fondo azul para todo el widget con subrayado azul aún visible. He probado en Jelly Bean , pero no creo que la versión de destino del SDK importe aquí.y este es el archivo searchablecolor.xml
fuente
Al final de esta publicación, expliqué con imágenes que esto se aplica para los formularios de xamarin. Pero creo que puedes entenderlo, porque está basado en el código fuente de la vista de búsqueda de Android
Cómo cambiar la imagen del botón cancelar de la barra de búsqueda en formularios xamarin
fuente
Si está inflando Searchview de esta manera "getMenuInflater (). Inflate (R.menu.search_menu, menu);". Luego puede personalizar esta vista de búsqueda a través de style.xml como se muestra a continuación.
fuente
¡Estaba cavando mucho sobre eso y finalmente encontré esta solución y funciona para mí!
Puedes usar esto
Si usa appcompat intente esto:
Si usa androidx intente esto:
Cambiará el icono predeterminado de serchview.
¡Espero eso ayude!
fuente