Estou tentando alterar o desenho que fica no widget da barra de ação da barra de ação do Android.
Atualmente, é assim:
mas preciso alterar o plano de fundo azul desenhável para uma cor vermelha.
Eu tentei muitas coisas antes de rolar meu próprio widget de pesquisa, mas nada parece funcionar.
Alguém pode me indicar a direção certa para mudar isso?
SearchView
segundo plano porque não está disponível no meioR.styleable
. Minha resposta abaixo descreve como fazer isso no código.Respostas:
Introdução
Infelizmente, não há como definir o
SearchView
estilo do campo de texto usando temas, estilos e herança em XML, como você pode fazer com o segundo plano dos itens no menu suspenso ActionBar . Isto é porqueselectableItemBackground
é listado como styleable emR.stylable
, ao passo quesearchViewTextField
(atributo tema que estamos interessados em) não é. Portanto, não podemos acessá-lo facilmente a partir de recursos XML (você receberá umNo resource found that matches the given name: attr 'android:searchViewTextField'
erro).Configurando o SearchView segundo plano do campo de texto a partir do código
Portanto, a única maneira de substituir adequadamente o plano de fundo do
SearchView
campo de texto é acessá-lo internamente, obter acesso à visualização que possui o plano de fundo com basesearchViewTextField
e definir o nosso.OBSERVAÇÃO: A solução abaixo depende apenas da id (
android:id/search_plate
) do elementoSearchView
, portanto, é mais independente da versão SDK do que a passagem das crianças (por exemplo, usarsearchView.getChildAt(0)
para obter a visão correta dentroSearchView
), mas não é à prova de balas. Especialmente se algum fabricante decidir reimplementarSearchView
elementos internos e o ID acima mencionado não estiver presente - o código não funcionará.No SDK, o plano de fundo do campo de texto
SearchView
é declarado através de nove patches ; portanto, faremos da mesma maneira. Você pode encontrar imagens png originais no diretório drawable-mdpi do repositório git do Android . Estamos interessados em duas imagens. Um para o estado em que o campo de texto está selecionado (denominado textfield_search_selected_holo_light.9.png ) e outro para onde não está (chamado textfield_search_default_holo_light.9.png ).Infelizmente, você precisará criar cópias locais das duas imagens, mesmo se desejar personalizar apenas o estado focado . Isso ocorre porque
textfield_search_default_holo_light
não está presente no R..drawable . Portanto, não é de fácil acesso@android:drawable/textfield_search_default_holo_light
, o que poderia ser usado no seletor mostrado abaixo, em vez de fazer referência ao drawable local.NOTA: Eu estava usando o tema Holo Light como base, mas você pode fazer o mesmo com o Holo Dark . Parece que não há diferença real nos 9 patches selecionados do estado entre os temas Claro e Escuro . No entanto, há uma diferença nos 9 patches para o estado padrão (consulte Claro vs Escuro ). Portanto, provavelmente não há necessidade de fazer cópias locais de 9 patches para o estado selecionado , para os temas Escuro e Claro (supondo que você queira lidar com ambos e fazer com que ambos pareçam os mesmos do Tema Holo ). Basta fazer uma cópia local e usá-la emselecionável para os dois temas.
Agora, você precisará editar nove patches baixados conforme sua necessidade (por exemplo, alterando a cor azul para vermelha). Você pode dar uma olhada no arquivo usando a ferramenta draw 9-patch para verificar se ele está definido corretamente após a sua edição.
Editei arquivos usando o GIMP com a ferramenta lápis de um pixel (bastante fácil), mas você provavelmente usará a ferramenta por conta própria. Aqui está o meu patch 9 personalizado para o estado focado :
NOTA: Para simplificar, usei apenas imagens para densidade mdpi . Você precisará criar 9 patches para várias densidades de tela se desejar o melhor resultado em qualquer dispositivo. As imagens para Holo
SearchView
podem ser encontradas nos mdpi , hdpi e xhdpi drawable.Agora, precisamos criar um seletor desenhável, para que a imagem apropriada seja exibida com base no estado da visualização. Crie um arquivo
res/drawable/texfield_searchview_holo_light.xml
com o seguinte conteúdo:Usaremos o drawable criado acima para definir o plano de fundo da
LinearLayout
visualização que contém o campo de textoSearchView
- seu ID éandroid:id/search_plate
. Então, veja como fazer isso rapidamente no código, ao criar o menu de opções:Efeito final
Aqui está a captura de tela do resultado final:
Como cheguei a isso
Acho que vale a pena mencionar como cheguei a isso, para que essa abordagem possa ser usada ao personalizar outras visualizações.
Verificando o layout da vista
Eu verifiquei como é o
SearchView
layout. No contratador do SearchView, é possível encontrar uma linha que infla o layout:Agora sabemos que o
SearchView
layout está no arquivo nomeadores/layout/search_view.xml
. Olhando para search_view.xml , podemos encontrar umLinearLayout
elemento interno (com IDsearch_plate
) que contémandroid.widget.SearchView$SearchAutoComplete
(parece com o nosso campo de texto de exibição de pesquisa):Agora, agora que o plano de fundo está definido com base no
searchViewTextField
atributo do tema atual .Atributo de investigação (é facilmente configurável?)
Para verificar como o
searchViewTextField
atributo é definido, investigamos res / values / themes.xml . Há um grupo de atributos relacionados aoSearchView
padrãoTheme
:Vemos que para o tema padrão, o valor é
@drawable/textfield_searchview_holo_dark
. ParaTheme.Light
valor também é definido nesse arquivo .Agora, seria ótimo se esse atributo estivesse acessível através do R.styleable , mas, infelizmente, não é. Para comparação, consulte outros atributos do tema que estão presentes em themes.xml e R.attr, como textAppearance ou selectableItemBackground . Se
searchViewTextField
estivesse presente emR.attr
(eR.stylable
), poderíamos simplesmente usar nosso seletor de desenho ao definir o tema para todo o aplicativo em XML. Por exemplo:O que deve ser modificado?
Agora sabemos que teremos que acessar
search_plate
através do código. No entanto, ainda não sabemos como deve ser. Em resumo, procuramos por elementos de desenho usados como valores em temas padrão: textfield_searchview_holo_dark.xml e textfield_searchview_holo_light.xml . Analisando o conteúdo, vemos que o drawable é oselector
que faz referência a outros dois drawables (que ocorrem com 9 patches posteriormente) com base no estado da visualização. Você pode encontrar drawables agregados de 9 patches em (quase) todas as versões do Android em androiddrawables.comCustomizando
Reconhecemos a linha azul em um dos 9 patches , então criamos uma cópia local e alteramos as cores conforme desejado.
fonte
SearchView
si mesmo). Tudo bem se eu mesclar sua resposta (substituindo onCreateOptionsMenu) na minha?onCreate()
método paraonCreateOptionsMenu()
método, como você sugeriu. Votou sua resposta.As soluções acima podem não funcionar se você estiver usando a biblioteca appcompat. Pode ser necessário modificar o código para fazê-lo funcionar na biblioteca appcompat.
Aqui está a solução de trabalho para a biblioteca appcompat.
fonte
Seu
onCreateOptionsMenu
método deve ser:onde seu item de pesquisa está
menu_search
fora do cursoe aqui está a
searchviewredversion
(esta é a versão xhdpi): http://img836.imageshack.us/img836/5964/searchviewredversion.pngfonte
A solução acima não funciona com o ActionBarSherlock 4.2 e, portanto, não é compatível com o Android 2.x. Aqui está o código de trabalho que configura o plano de fundo SearchView e o texto da dica no ActionBarSherlock 4.2:
fonte
Estou cansado de fazer isso também e estou usando a v7. O aplicativo falhou quando tentei pegar a
searchPlate
via o,getIdentifier()
então fiz da seguinte maneira:fonte
Eu também enfrentei o mesmo problema: usei a biblioteca appcompat v7 e defini o estilo personalizado para ela. Na pasta drawable, coloque o arquivo bottom_border.xml que se parece com isso:
Na pasta de valores styles_myactionbartheme.xml:
Eu defini o arquivo custommenu.xml para exibir o menu:
Sua atividade deve estender o ActionBarActivity em vez de Activity.
No arquivo de manifesto:
Para mais informações, consulte aqui:
Aqui http://www.jayway.com/2014/06/02/android-theming-the-actionbar/
fonte
Atualizar
Se você estiver usando o AndroidX, poderá fazê-lo assim
fonte
Primeiro, vamos criar um arquivo XML chamado search_widget_background.xml, para ser usado como um drawable, ou seja, no diretório drawable.
Este drawable será usado como pano de fundo para o nosso widget de pesquisa. Defino a cor para vermelho porque é o que você solicitou, mas você pode defini-la para qualquer cor definida pela tag @color. Você pode modificá-lo ainda mais usando os atributos definidos para a marca de forma (faça cantos arredondados, faça um plano de fundo oval etc.).
O próximo passo é definir o plano de fundo do nosso widget de pesquisa para este. Isso pode ser realizado pelo seguinte:
fonte
SearchView
(nomeadosearch_plate
), não emSearchView
si mesmo. Veja minha resposta para mais detalhes. No entanto, tenho que admitir, não tentei usar a resposta de @ (baba tenor).SearchView
si só estará sempre abaixo do plano de fundo dos elementos que estão dentroSearchView
. Existe umaLinearLayout
visão internaSearchView
que tem idsearch_plate
, que sets tem esse elemento sublinhado azul como plano de fundo. Veja minha resposta para detalhes. Portanto, com sua solução, o resultado é fundo azul para todo o widget, com sublinhado azul ainda visível. Eu testei no Jelly Bean , mas não acho que a versão de destino do SDK seja importante aqui.e este é o arquivo searchablecolor.xml
fonte
Expliquei no final deste post com imagens que se aplicam aos formulários xamarin. Mas eu acho que você pode entender, porque é baseado no código fonte do searchview do android
Como alterar a imagem do botão Cancelar na barra de pesquisa em formulários xamarin
fonte
Se você estiver inflando o Searchview como este "getMenuInflater (). Inflate (R.menu.search_menu, menu);". Em seguida, você pode personalizar essa pesquisa por meio do style.xml, como abaixo.
fonte
Eu estava cavando muito sobre isso e finalmente encontrei esta solução e funciona para mim!
Você pode usar isso
Se você usa appcompat, tente o seguinte:
Se você usa androidx, tente o seguinte:
Ele mudará o ícone padrão do serchview.
Espero que ajude!
fonte