Comecei a usar o novo Snackbar na Biblioteca de Suporte a Design, mas descobri que quando você define "android: textColor" em seu tema, ele se aplica à cor do texto da barra de ferramentas. Obviamente, isso é um problema se a cor primária do texto for escura.
Alguém conhece uma maneira de contornar isso ou tem algum conselho sobre como devo colorir meu texto?
EDITAR janeiro de 2017: (Pós-resposta)
Embora existam algumas soluções personalizadas para corrigir o problema abaixo, provavelmente é bom fornecer a maneira correta de criar Snackbars de tema.
Em primeiro lugar, você provavelmente não deveria definir android:textColor
seus temas (a menos que realmente conheça o escopo do que está usando o tema). Isso define a cor do texto de basicamente todas as visualizações que se conectam ao seu tema. Se você deseja definir cores de texto em suas visualizações que não são padrão, use android:primaryTextColor
e faça referência a esse atributo em suas visualizações personalizadas.
No entanto, para aplicar temas a Snackbar
, consulte este guia de qualidade de um documento de material de terceiros: http://www.materialdoc.com/snackbar/ (Siga a implementação do tema programático para que não dependa de um estilo xml)
Para referência:
// create instance
Snackbar snackbar = Snackbar.make(view, text, duration);
// set action button color
snackbar.setActionTextColor(getResources().getColor(R.color.indigo));
// get snackbar view
View snackbarView = snackbar.getView();
// change snackbar text color
int snackbarTextId = android.support.design.R.id.snackbar_text;
TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);
textView.setTextColor(getResources().getColor(R.color.indigo));
// change snackbar background
snackbarView.setBackgroundColor(Color.MAGENTA);
(Você também pode criar seus próprios Snackbar
layouts personalizados , consulte o link acima. Faça-o se este método parecer muito hacky e você quiser uma maneira confiável de manter seu Snackbar personalizado por último por meio de possíveis atualizações da biblioteca de suporte).
Em alternativa, consulte as respostas abaixo para obter respostas semelhantes e talvez mais rápidas para resolver o seu problema.
android:textColorPrimary
Respostas:
Eu sei que isso já foi respondido, mas a maneira mais fácil que encontrei foi diretamente no make usando o
Html.fromHtml
método e umafont
tagfonte
Eu encontrei isso em Quais são os novos recursos da Android Design Support Library e como usar seu Snackbar?
Isso funcionou para mim para alterar a cor do texto em um Snackbar.
ATUALIZAÇÃO: ANDROIDX: Como dblackker aponta nos comentários, com a nova biblioteca de suporte AndroidX, o código para encontrar o ID de Snackbar TextView muda para:
fonte
snackbar_action
vez desnackbar_text
. Veja esta resposta para um exemplo: stackoverflow.com/a/36800101/293280snack.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
Hackear
android.support.design.R.id.snackbar_text
é frágil, uma maneira melhor ou menos hacky de fazer isso é:fonte
Criei esta função de extensão kotlin que uso em meus projetos:
Uso como você esperaria:
fonte
com.google.android.material.R.id.snackbar_text
se você migrar para o AndroidX.Tudo bem, então eu corrigi basicamente reorganizando a forma como faço as cores do texto.
No meu tema claro, eu defini
android:textColorPrimary
comonormal dark text
eu queria e eu definiandroid:textColor
comowhite
.Eu atualizei todas as minhas visualizações de texto e botões para ter
android:textColor="?android:attr/textColorPrimary".
Então porque snack-retira
textColor
, eu apenas definir todo o meu outro textotextColorPrimary
.EDITAR DE JANEIRO DE 2017: ---------------------------------------------- ------
Portanto, como dizem os comentários, e conforme declarado na questão original editada acima, você provavelmente não deve definir
android:textColor
em seus temas, pois isso altera a cor do texto de cada visualização dentro do tema.fonte
android:textColor
em seu tema. É um atributo de estilo deTextView
. Se você defini-lo em seu tema, você substitui a cor do texto de todosTextView
ouButton
que não especifica sua cor de texto em XML. Essa também é a mensagem da barra de ferramentas que normalmente pegaria cor de sua sobreposição de tema escuro .Uma abordagem é usar spans:
Com spans, você também pode adicionar várias cores e estilos dentro de um Snackbar. Aqui está um bom guia:
https://androidbycode.wordpress.com/2015/06/06/material-design-snackbar-using-the-design-support-library/
fonte
Se você migrou para o androidX, use em
com.google.android.material.R.id.snackbar_text
vez deandroid.support.design.R.id.snackbar_text
para alterar a cor do texto na barra de ferramentas .fonte
A única maneira que vejo é usando
getView()
e percorrendo seu filho. Não sei se vai funcionar, e é ruim como parece. Espero que eles adicionem alguma API sobre esse problema em breve.fonte
Se você for migrar seu código para o AndroidX, a propriedade TextView agora é:
fonte
É o que eu uso quando preciso de cores personalizadas
E consumido como:
fonte
Eu mudei meu tema
para
Funcionou. Tente usar um tema simples em vez de luz ou outro tema.
fonte
Se você decidir usar a solução suja e hacky para encontrar TextView no Snackbar por id e já migrou para o androidx, então aqui está o código:
fonte
Você pode usar esta biblioteca: https://github.com/SandroMachado/restaurant
Disclaimer: Eu fiz a biblioteca.
fonte
Encontrar por id não funcionou para mim, então encontrei outra solução:
fonte
Use o
Snackbar
incluído na Biblioteca de Componentes de Materiais e aplique osetTextColor
definir a cor do textosetActionTextColor
para definir a cor do texto usada pela ação. Você pode usar uma cor ou um seletor de coressetBackgroundTint
para definir a cor de fundo do SnackbarAlgo como:
fonte
Eu tenho um código simples que ajudará a obter uma instância de ambos textview do Snackbar, depois disso você pode chamar todos os métodos que são aplicáveis em um textview.
fonte
Apenas para economizar seu precioso tempo de desenvolvimento, aqui está o método estático que estou usando:
Isto é o que parece:
fonte
Se você estiver em Kotlin , poderá criar uma extensão:
Uso :
fonte
De acordo com os novos componentes do AndroidX Jitpack
Use esta extensão que eu criei
Use assim
fonte
Esta é a minha solução alternativa para resolver este tipo de problema ao
androidx
usarkotlin
Você precisa inicializar
mContent
dentro doonViewCreated
método como abaixofonte
Atualmente (janeiro de 2020) com
com.google.android.material:material:1.2.0
e provavelmente também1.1.0
É definitivamente a melhor maneira de fazer isso substituindo estes estilos:
Se você usar um tema material com
.Bridge
no final, por algum motivo, nenhum desses estilos é definido. Então Snackar usará algum layout legado sem esses estilos.Descobri no código-fonte que ambos
snackbarButtonStyle
esnackbarTextViewStyle
devem ser definidos, caso contrário, não serão usados.fonte
Eu também notei o mesmo problema. Graças às respostas aqui, criei uma pequena classe, que pode ajudar a resolver esse problema mais facilmente, apenas substituindo este:
com isso:
Aqui está minha aula:
}
fonte