Antes da AppCompat
atualização ser lançada hoje, eu era capaz de alterar a cor dos botões no Android L, mas não nas versões mais antigas. Depois de incluir a nova atualização do AppCompat, não consigo alterar a cor das duas versões, quando tento o botão simplesmente desaparece. Alguém sabe como mudar a cor do botão?
As figuras a seguir mostram o que eu quero alcançar:
O botão branco é o padrão, o vermelho é o que eu quero.
Isto é o que eu estava fazendo anteriormente para alterar a cor dos botões no styles.xml
:
<item name="android:colorButtonNormal">insert color here</item>
e para fazer isso dinamicamente:
button.getBackground().setColorFilter(getResources().getColor(insert color here), PorterDuff.Mode.MULTIPLY);
Também mudei o tema pai de @android:style/Theme.Material.Light.DarkActionBar
paraTheme.AppCompat.Light.DarkActionBar
Respostas:
Oficialmente corrigido na Biblioteca de suporte rev.22 (13 de março de 2015). Veja o problema relevante do código do Google:
https://issuetracker.google.com/issues/37008632
Exemplo de uso
theme.xml:
v21 / theme.xml
fonte
android:theme="@style/ColoredButton"
, e em styles.xml<style name="ColoredButton" parent="Widget.AppCompat.Button"> <item name="colorButtonNormal">@color/button_yellow</item> </style>
Editar (22.06.2016):
A biblioteca Appcompat começou a oferecer suporte aos botões de material depois que eu publiquei a resposta original. Nesta postagem, você pode ver a implementação mais fácil de botões elevados e planos.
Resposta original:
Como o AppCompat não suporta o botão, você pode usar o xml como plano de fundo. Para fazer isso, dei uma olhada no código-fonte do Android e encontrei os arquivos relacionados para criar botões de material.
1 - Veja a implementação original do botão de material da fonte.
Dê uma olhada no btn_default_material.xml no código fonte do Android .
Você pode copiar o arquivo na pasta drawable-v21 de projetos. Mas não toque na cor aqui. O arquivo que você precisa alterar é o segundo arquivo.
drawable-v21 / custom_btn.xml
2 - Obtenha a forma do botão do material original
Como você percebe, há uma forma usada dentro deste drawable que você pode encontrar neste arquivo do código-fonte .
3 - Obter dimensões do botão de material
E neste arquivo, existem algumas dimensões usadas no arquivo que você pode encontrar aqui . Você pode copiar o arquivo inteiro e colocá-lo na sua pasta de valores . Isso é importante para aplicar o mesmo tamanho (usado nos botões de material) a todos os botões
4 - Crie outro arquivo drawable para versões antigas
Para versões mais antigas, você deve ter outro drawable com o mesmo nome. Estou colocando os itens diretamente em linha, em vez de fazer referência. Você pode querer referenciá-los. Mas, novamente, o mais importante são as dimensões originais do botão de material.
drawable / custom_btn.xml
Resultado
Seu botão terá efeito cascata nos dispositivos Lollipop. As versões antigas terão exatamente o mesmo botão, exceto o efeito cascata. Mas desde que você forneça desenhos para diferentes estados, eles também responderão a eventos de toque (como na maneira antiga).
fonte
Isso foi aprimorado na v23.0.0 da biblioteca AppCompat com a adição de mais temas, incluindo
Antes de tudo, inclua a dependência appCompat, se você ainda não tiver
agora que você precisa usar a v23 do aplicativo compatível, também precisará segmentar o SDK-v23!
Na tua
values/theme
Na tua
values/style
Na tua
values-v21/style
Como o tema do seu botão é baseado em
Widget.AppCompat.Button.Colored
A cor do texto no botão é branca por padrão!mas parece que há um problema quando você desativa o botão, o botão muda de cor para cinza claro, mas a cor do texto permanece branca!
Uma solução alternativa para isso é definir especificamente a cor do texto no botão para branco! como eu fiz no estilo mostrado acima.
agora você pode simplesmente definir seu botão e deixar o AppCompat fazer o resto :)
Estado desativado
Estado ativado
Editar:
Adicionar
<Button android:theme="@style/BrandButtonStyle"/>
fonte
<Button android:theme="@style/BrandButtonStyle"/>
. Tem que ser otheme
atributo e não ostyle
atributo.Na Biblioteca de suporte do Android 22.1.0, o Google tomou
Button
conhecimento da tonalidade. Portanto, outra maneira de personalizar a cor de fundo do botão é usar obackgroundTint
atributoPor exemplo,
fonte
Para suportar botões coloridos, use a biblioteca AppCompat mais recente (> 23.2.1 ) com:
Widget AppCompat:
Estilo AppCompat:
NB! Para definir uma cor personalizada em xml: use o attr: em
app
vez deandroid
(use
alt+enter
ou declarexmlns:app="http://schemas.android.com/apk/res-auto"
usarapp
)app : backgroundTint = "@ color / your_custom_color"
Exemplo:
fonte
Com a Biblioteca de suporte mais recente, você pode herdar sua atividade
AppCompatActivity
, para que ela inflate seuButton
asAppCompatButton
e lhe dê a oportunidade de estilizar a cor de cada botão no layout com o uso deandroid:theme="@style/SomeButtonStyle"
, ondeSomeButtonStyle
é:Trabalhou para mim em 2.3.7, 4.4.1, 5.0.2
fonte
android:theme
e nãostyle
. Você também pode adicionarcolorControlHighlight
ecolorControlActivated
.Theme.AppCompat.Light
lugar.se você quiser abaixo do estilo
adicione este estilo seu botão
se você quer esse estilo
adicione código abaixo
fonte
compile 'com.android.support:appcompat-v7:23.1.0'
Você deve adicionar.A resposta está no TEMA, não no estilo
O problema é que a cor do botão permanece no colorButtonNormal do tema. Eu tentei mudar o estilo de muitas maneiras diferentes, sem sorte. Então eu mudei o tema do botão .
Crie um tema com colorButtonNormal e colorPrimary:
Use este tema no botão
O "AppTheme.Button" pode ser qualquer coisa que se estenda ao estilo do botão, como aqui eu uso a cor primária para a cor do texto:
E você obtém o botão na cor que desejar, compatível com o design do material.
fonte
Acabei de criar uma biblioteca Android, que permite modificar facilmente a cor do botão e a cor da ondinha
https://github.com/xgc1986/RippleButton
Você não precisa criar um estilo para cada botão que deseja com uma cor diferente, permitindo que você personalize as cores aleatoriamente
fonte
este trabalho para mim com appcompat-v7: 22.2.0 no android + 4.0
em seus styles.xml
no seu arquivo de layout
fonte
Layout:
styles.xml:
color / button_background_selector.xml:
color / button_text_selector.xml:
fonte
Para quem usa um
ImageButton
aqui é como você faz:No style.xml:
na v21 / style.xml:
Em seguida, no seu arquivo de layout:
fonte
Se você usar a solução de estilo com colorButtonNormal , não esqueça de herdar o Widget.AppCompat.Button.Colored para que o efeito cascata esteja funcionando;)
Gostar
fonte
Outra solução simples usando o AppCompatButton
fonte
Usar:
Ou até:
e isso dará uma cor personalizada ao botão.
fonte
Se você deseja apenas o botão de material "Simples", é possível personalizar o plano de fundo usando o atributo selecionávelItemBackground, conforme explicado aqui .
fonte
Para alterar a cor de um único botão
fonte
Para mim, o problema era que no Android 5.0
android:colorButtonNormal
não havia efeito e, na verdade, nenhum item do tema (comoandroid:colorAccent
), mas no Android 4.4.3, por exemplo. O projeto foi configurado comcompileSdkVersion
etargetSdkVersion
para 22, então eu fiz todas as alterações conforme sugerido pelo @Muhammad Alfaifi, mas no final, notei que o problema era o buildToolsVersion , que não foi atualizado. Depois que mudei para 23.0.1 , tudo começou a funcionar quase como o normal. Agora, oandroid:colorButtonNormal
ainda não tem efeito, mas pelo menos o botão reageandroid:colorAccent
, o que para mim é aceitável.Espero que essa dica possa ajudar alguém. Nota: apliquei o estilo diretamente no botão, pois os botões
android:theme=[...]
também não tiveram efeito.fonte
Uma maneira de fazer isso permite que você aponte apenas para um estilo e NÃO para o tema TODOS os botões do seu aplicativo sejam iguais.
Em themes.xml, adicione um tema
Agora em styles.xml, adicione
Agora, no seu layout, aponte para o ESTILO no seu botão
fonte
ATUALIZAR
Use a biblioteca de suporte de design (23.2.0) e os appcompatwidgets conforme abaixo
Na Biblioteca de suporte do Android 22.1 :
A lista completa de widgets com reconhecimento de tonalidade:
Projeto de material para dispositivos pré-pirulito :
fonte
Se você deseja usar o estilo AppCompat como Widget.AppCompat.Button , Base.Widget.AppCompat.Button.Colored , etc., será necessário usar esses estilos com visualizações compatíveis da biblioteca de suporte.
O código abaixo não funciona para dispositivos pré-lolipop:
Você precisa usar o AppCompatButton para ativar os estilos do AppCompat:
fonte
ImageView
é substituídoAppCompatImageView
e deve ser o mesmo com todos os widgets, que têm aAppCompat
versão correspondente .android.support.v7.widget.AppCompatImageView
explicitamente.last target version
@power?Eu uso isso. Efeito cascata e botão clique em trabalho de sombra.
style.xml
Botão no layout:
fonte
Na verdade, eu não queria uma alteração nos meus estilos de botão personalizados, mas infelizmente eles não estavam mais funcionando.
Meu aplicativo tem uma minSdkVersion de 9 e tudo funcionou antes.
Não sei por que, mas desde que removi o andróide: antes do buttonStyle parece funcionar novamente
now = working:
<item name="buttonStyle">@style/ButtonmyTime</item>
before = apenas botões de material cinza:
<item name="android:buttonStyle">@style/ButtonmyTime</item>
Não tenho uma pasta especial para a versão mais recente do Android, já que meus botões são bastante planos e devem ter a mesma aparência em todas as versões do Android.
Talvez alguém possa me dizer por que tive que remover o "android:" O ImageButton ainda está trabalhando com "android:"
fonte
Depois de dois dias procurando respostas, o tema do botão não funcionou para mim na API <21.
Minha única solução é substituir o AppCompatButton tintométrico não apenas pelo tema base do aplicativo "colorButtonNormal", mas também pela visualização backgroundTint como esta:
Você pode definir a cor do seu botão assim:
fonte
Esta resposta SO me ajudou a chegar a uma resposta https://stackoverflow.com/a/30277424/3075340
Eu uso esse método utilitário para definir a tonalidade de fundo de um botão. Funciona com dispositivos pré-pirulito:
Como usar no código:
Dessa forma, você não precisa especificar um ColorStateList se quiser apenas alterar a tonalidade do plano de fundo e nada mais, além de manter os efeitos bonitos dos botões e o que não.
fonte
Defino
android:textColor
como@null
no meu tema de botão e isso ajuda.styles.xml
some_layout.xml
Agora, a cor do texto do botão é
colorAccent
definida emAppTheme
fonte
se você usar o kotlin, poderá ver Todos os atributos do MaterialButton são suportados. Não use o atributo android: background. O MaterialButton gerencia seu próprio drawable de segundo plano e definir um novo plano de fundo significa que a cor desabilitada do botão Material não pode mais garantir que os novos atributos introduzidos funcionem corretamente. Se o plano de fundo padrão for alterado, o Botão Material não poderá garantir um comportamento bem definido. At MainActivity.kt
Em activity_main.xml
recurso: Exemplo de mudança de cor do botão Material
fonte
se você quiser fazer isso via código em qualquer cor, use o seguinte:
fonte