Na nova biblioteca AppCompat, podemos colorir o botão desta forma:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/follow"
android:id="@+id/button_follow"
android:backgroundTint="@color/blue_100"
/>
Como posso definir a tonalidade do botão programaticamente em meu código? Basicamente, estou tentando implementar uma coloração condicional do botão com base em alguma entrada do usuário.
android
android-appcompat
Stephane
fonte
fonte
Respostas:
De acordo com a documentação, o método relacionado
android:backgroundTint
é setBackgroundTintList (lista ColorStateList)Atualizar
Siga este link para saber como criar um recurso de lista de estado de cor.
então carregue-o usando
onde
contextInstance
está uma instância de umContext
usando AppCompart
fonte
ViewCompat.setBackgroundTintList(View, ColorStateList)
que pode ser usado desde a API 4. Mas só funciona para visualizações que implementamTintableBackgroundView
, por exemploAppCompatButton
(em vez do usualButton
).ViewCompat.setBackgroundTintList(View, ColorStateList)
, como sugeriu @Jon Adams, faz ainda mais sentido, já que View.setSupportButtonTintList é restrito aRestrictTo
anotações. Detalhes aqui: developer.android.com/reference/android/support/annotation/…Você poderia usar
Mas eu recomendo que você use uma coloração drawable da biblioteca de suporte que acaba de ser lançada ontem:
Você pode encontrar mais nesta postagem do blog (consulte a seção "Tingimento de drawable")
fonte
Parece que as visualizações têm mecânica própria para gerenciamento de tonalidade, então melhor será colocar a lista de tonalidade:
fonte
Para estender adequadamente a resposta de dimsuz fornecendo uma situação de código real, consulte o seguinte trecho de código:
Esta solução é para o cenário em que um drawable é usado como plano de fundo do botão. Ele funciona em dispositivos pré-Lollipop também.
fonte
Você já tentou algo assim?
observe que getResources () só funcionará em uma atividade. Mas também pode ser chamado em qualquer contexto.
fonte
aqui está como fazer isso em kotlin:
fonte
Você pode usar DrawableCompat, por exemplo
fonte
isso é facilmente resolvido no novo Botão de material da biblioteca de design de material, primeiro, adicione a dependência:
em seguida, em seu XML, use para o botão:
e quando você quiser mudar a cor, aqui está o código em Kotlin, ele não está obsoleto e pode ser usado antes do Android 21:
fonte
A maneira como consegui fazer o meu funcionar foi usando
CompoundButtonCompat.setButtonTintList(button, colour)
.No meu entendimento, isso funciona independentemente da versão do Android.
fonte
Eu tive um problema parecido. Desejei colorir um fundo de drawable complexo para uma visualização com base em um valor de cor (int). Consegui usar o código:
Onde color é um valor interno que representa a cor necessária. Isso representa o xml ColorStateList simples:
Espero que isto ajude.
fonte
ColorStateList.valueOf(ColorInt)
Para ImageButton, você pode usar:
fonte
Se você estiver usando
Kotlin
eMaterial Design
, poderá alterar a cor do seuMaterialButton
assim:Você pode melhorá-lo ainda melhor criando uma função de extensão para o seu
MaterialButton
, a fim de tornar seu código mais legível e um pouco mais conveniente:Em seguida, você pode usar sua função em qualquer lugar desta forma:
fonte
Além da resposta de Shayne3000 , você também pode usar um recurso de cor (não apenas uma cor interna ). Versão Kotlin :
fonte
A resposta sugerida aqui não funciona corretamente no Android 5.0 se sua lista de estados de cores com base em XML faz referência a atributos temáticos. Por exemplo, eu tenho uma lista de estados de cores xml como esta:
Usar isso como meu backgroundTint de xml funciona muito bem no Android 5.0 e em tudo o mais. No entanto, se eu tentar definir isso em um código como este:
(Não faça isso)
Na verdade, não importa se eu passo a Activity ou o contexto do botão para o método ContextCompat.getColorStateList (), nem me dá a lista de estados de cores adequada com relação ao tema do botão. Isso ocorre porque o uso de atributos de tema em listas de estados de cores não era compatível até que a API 23 e o ContextCompat não fizessem nada de especial para resolvê-los. Em vez disso, você deve usar AppCompatResources.getColorStateList (), que faz sua própria análise de recurso / resolução de atributo de tema em dispositivos <API 23.
Em vez disso, você deve usar isto:
TLDR: use AppCompatResources e não -ContextCompat- se precisar de recursos temáticos resolvidos em todas as versões de API do Android.
Para obter mais informações sobre o assunto, consulte este artigo .
fonte