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.


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);

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.

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


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


2

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


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.


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.