Como alterar o estilo de um TextView em tempo de execução

98

Tenho um aplicativo Android no qual, quando o usuário toca em TextView, gostaria de aplicar um estilo definido.

Pensei em encontrar um textview.setStyle()mas não existe. eu tentei

textview.setTextAppearance();

mas não funciona.

Cris
fonte
1
Eu li em algum lugar que isso não é possível ... stackoverflow.com/questions/2016249/… . Mas você pode definir algumas propriedades separadamente.
Floern
1
Você tentou: textView.setTextTypeface? developer.android.com/reference/android/widget/…
Jonathan Roth
21
@Falmarri VOCÊ já olhou os documentos da API TextView? Nesse caso, talvez você possa dizer algo mais construtivo.
Fletch

Respostas:

143

Fiz isso criando um novo arquivo XML da res/values/style.xmlseguinte maneira:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="boldText">
        <item name="android:textStyle">bold|italic</item>
        <item name="android:textColor">#FFFFFF</item>
    </style>

    <style name="normalText">
        <item name="android:textStyle">normal</item>
        <item name="android:textColor">#C0C0C0</item>
    </style>

</resources>

Também tenho entradas no meu arquivo "strings.xml" como esta:

<color name="highlightedTextViewColor">#000088</color>
<color name="normalTextViewColor">#000044</color>

Então, em meu código, criei um ClickListener para interceptar o evento tap naquele TextView: EDITAR: A partir da API 23 'setTextAppearance' está obsoleto

    myTextView.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view){
                    //highlight the TextView
                    //myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    if (Build.VERSION.SDK_INT < 23) {
       myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    } else {
       myTextView.setTextAppearance(R.style.boldText);
    }
     myTextView.setBackgroundResource(R.color.highlightedTextViewColor);
                }
            });

Para alterá-lo de volta, você usaria isto:

if (Build.VERSION.SDK_INT < 23) {
    myTextView.setTextAppearance(getApplicationContext(), R.style.normalText);
} else{
   myTextView.setTextAppearance(R.style.normalText);
}
myTextView.setBackgroundResource(R.color.normalTextViewColor);
Glenn
fonte
2
Na verdade, isso não funciona com estilos de sombra. Se você deseja alterar a sombra, deve fazê-lo da seguinte maneira: lockText.setShadowLayer (20, 4, 4, 0xFFFF0000);
Lukas
3
Para evitar a verificação do SDK, você pode usar TextViewCompat.setTextAppearance (myTextView, R.style.myStyle);
Justin Fiedler
90

Como Jonathan sugeriu, usando textView.setTextTypefaceobras, acabei de usar em um aplicativo há alguns segundos.

textView.setTypeface(null, Typeface.BOLD); // Typeface.NORMAL, Typeface.ITALIC etc.
DKDiveDude
fonte
9
Você pode usar textView.setTypeface (null, Typeface.BOLD); textView..setTypeface (null, Typeface.ITALIC); textView.setTypeface (null, Typeface.BOLD_ITALIC);
peceps de
2
textView.setTypeface (null, Typeface.BOLD) é o que funcionou para mim. Claro, você poderia usar 1 em vez disso, mas acho que não é uma boa prática inserir constantes manualmente. Melhor usar variáveis ​​predefinidas em bibliotecas.
Pijusn
4
Não incentive as pessoas a usarem ints em vez de constantes
Chris.Jenkins
3
Um bom! Meu erro foi enviar minha fonte antiga como primeiro parâmetro. Portanto, funciona quando eu mudo NORMAL -> NEGRITO, mas não NEGRITO -> NORMAL. Eu não sabia que o primeiro parâmetro poderia ser nulo! Agora funciona bem para mim!
Felipe
12
TextView tvCompany = (TextView)findViewById(R.layout.tvCompany);
tvCompany.setTypeface(null,Typeface.BOLD);

Você pode configurá-lo a partir do código. Tipo de letra

Azhar
fonte
4

Programaticamente: tempo de execução

Você pode fazer programaticamente usando setTypeface ():

textView.setTypeface(null, Typeface.NORMAL);      // for Normal Text
textView.setTypeface(null, Typeface.BOLD);        // for Bold only
textView.setTypeface(null, Typeface.ITALIC);      // for Italic
textView.setTypeface(null, Typeface.BOLD_ITALIC); // for Bold and Italic

XML: Tempo de Design

Você também pode definir em XML:

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"

Espero que isso ajude

Summved

Summved Jain
fonte
2

eu descobri textView.setTypeface(Typeface.DEFAULT_BOLD);que é o método mais simples.

sfera
fonte
Isso muda o tipo de letra. não é o estilo especificado pelo OP.
HBG
É verdade, ainda assim, este era o método mais simples - e pelo que me lembro o único método - na época da postagem. Não tenho certeza se um novo método de API foi adicionado nesse meio tempo, o que permite alterar o "estilo" para negrito sem alterar a fonte. Por favor me corrija se eu estiver errado.
sfera
1

tente esta linha de código.

textview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);

aqui, ele obterá o Typeface atual desta visualização de texto e o substituirá usando o novo Typeface. Um novo tipo de letra aqui é, DEFAULT_BOLDmas você pode aplicar muitos mais.

Md. Sajedul Karim
fonte
você prefere explicar por que seu código resolverá o problema, obrigado.
Muhammed Refaat
O OP deseja alterar o estilo, não o tipo de letra.
HBG
0

Consulte o doco para setText () em TextView http://developer.android.com/reference/android/widget/TextView.html

Para estilizar suas strings, anexe objetos android.text.style. * A um SpannableString ou consulte a documentação de Tipos de recursos disponíveis para obter um exemplo de configuração de texto formatado no arquivo de recurso XML.

GSree
fonte
0

Dependendo de qual estilo você deseja definir, você deve usar métodos diferentes. O material TextAppearance tem seu próprio setter, TypeFace tem seu próprio setter, background tem seu próprio setter, etc.

akohout
fonte