Android - defina o TextView TextStyle programaticamente?

232

Existe uma maneira de definir o textStyleatributo de um TextViewprogramaticamente? Não parece haver um setTextStyle()método.

Para ser claro, não estou falando de estilos de exibição / widget! Eu estou falando sobre o seguinte:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />
Jake Wilson
fonte
1
você pode fazer referência no link abaixo e bloqueio top 1 resposta stackoverflow.com/questions/6200533/...
Tiep
Por favor, verifique minha resposta aqui . Espero que isso irá ajudá-lo
Summved Jain

Respostas:

410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface é o atributo textStyle.

Como Shankar V adicionou, para preservar os atributos de tipo de letra definidos anteriormente, você pode usar:

textview.setTypeface(textview.getTypeface(), Typeface.BOLD);
Raz
fonte
14
deveria sertextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V
2
@IlyaEremin para preservar a fonte definida anteriormente, você precisa usá-la assim.
Sankar V
Editou minha resposta com base no comentário do @SankarV.
Raz
13
Eu acho que você deve perder o padrão: holder.title.setTypeface (holder.title.getTypeface (), Typeface.BOLD);
Iman Akbari
Na verdade textview.getTypeface().getStyle()éandroid:textStyle
Pierre
126

Digamos que você tenha um estilo chamado RedHUGEText em seus values ​​/ styles.xml:

<style name="RedHUGEText" parent="@android:style/Widget.TextView">
    <item name="android:textSize">@dimen/text_size_huge</item>
    <item name="android:textColor">@color/red</item>
    <item name="android:textStyle">bold</item>
</style>

Basta criar seu TextView como de costume no arquivo XML layout / your_layout.xml, digamos:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" />

E no código java da sua atividade, você faz o seguinte:

TextView textViewTitle = (TextView) findViewById(R.id.text_view_title);
textViewTitle.setTextAppearance(this, R.style.RedHUGEText);

Funcionou para mim! E aplicou cor, tamanho, gravidade, etc. Eu usei em aparelhos e tablets com níveis de API do Android de 8 a 17 sem problemas. Observe que, a partir do Android 23, esse método foi preterido. O argumento de contexto foi descartado; portanto, a última linha precisaria ser:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

Lembre-se ... isso é útil apenas se o estilo do texto realmente depende de uma condição da sua lógica Java ou se você está construindo a interface do usuário "on the fly" com código ... caso contrário, é melhor apenas Faz:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" 
    style="@style/RedHUGEText" />

Você sempre pode fazer do seu jeito!

Oscar Salguero
fonte
4
Isso definirá apenas um subconjunto de atributos que podem ser definidos em uma <style>tag. Ele faz os mais comuns (tamanho, cor, estilo), mas não se aplica outros (incluindo o preenchimento de fundo, gravidade, etc)
karl
5
Parece exigir API mínima 23?
William T. Mallard
4
existem dois métodos, um para API <23 e outro para API 23+. Eles parecem idênticos, exceto o de <23 assume um argumento de contexto e o de 23+ não. Sob o capô, o da api 23+ chama o método para <23 e usa o contexto do membro para a visualização de texto.
MrPlow
63

Pesquise setTextAppearanceou também setTextTypeface. Há uma pergunta semelhante no stackoverflow: Como alterar o estilo de um TextView em tempo de execução

peter.bartos
fonte
setTextAppearance reprovou a API nível 23
athospy
existe um novo método para a API 23+ que simplesmente não aceita um argumento de contexto.
MrPlow
52

Existem muitas maneiras de realizar essa tarefa: -

1

String text_view_str = "<b>Bolded text</b>, <i>italic text</i>, even <u>underlined</u>!";
TextView tv = (TextView)findViewById(R.id.ur_text_view_id);
tv.setText(Html.fromHtml(text_view_str));

2)

tv.setTypeface(null, Typeface.BOLD);
tv.setTypeface(null, Typeface.ITALIC);
tv.setTypeface(null, Typeface.BOLD_ITALIC);
tv.setTypeface(null, Typeface.NORMAL);

3)

SpannableString spannablecontent=new SpannableString(o.content.toString());
spannablecontent.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 
                         0,spannablecontent.length(), 0);
// set Text here
tt.setText(spannablecontent);

4)

<?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>

 tv.setTextAppearance(getApplicationContext(), R.style.boldText);

ou se você quiser através de xml

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"
duggu
fonte
setTextAppearance () é a resposta que eu estava procurando para aplicar um estilo personalizado definido no meu XML. Obrigado.
Ashario
Na minha opinião, esta é a melhor resposta para o tópico. Muitas opções para chamada de programação em código
Nguyen Minh Hien
9

Kotlin Version

Para manter a fonte atual, além do estilo do texto:

textView.apply {
    setTypeface(typeface, Typeface.NORMAL)
    // or
    setTypeface(typeface, Typeface.BOLD)
    // or
    setTypeface(typeface, Typeface.ITALIC)
    // or
    setTypeface(typeface, Typeface.BOLD_ITALIC)
}
aminografia
fonte
7

Esta pergunta é feita em muitos lugares e de várias maneiras diferentes. Originalmente, eu respondi aqui, mas acho que é relevante também neste tópico (desde que acabei aqui quando estava procurando por uma resposta).

Não há uma solução de linha para esse problema, mas isso funcionou para o meu caso de uso. O problema é que o construtor 'View (context, attrs, defStyle)' não se refere a um estilo real, ele quer um atributo. Então, vamos:

  1. Definir um atributo
  2. Crie um estilo que você deseja usar
  3. Aplique um estilo para esse atributo em nosso tema
  4. Crie novas instâncias de nossa visão com esse atributo

Em 'res / values ​​/ attrs.xml', defina um novo atributo:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="customTextViewStyle" format="reference"/>
    ...
</resources>    

Em res / values ​​/ styles.xml ', vou criar o estilo que quero usar no meu TextView personalizado

<style name="CustomTextView">
    <item name="android:textSize">18sp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:paddingLeft">14dp</item>
</style>

Em 'res / values ​​/ themes.xml' ou 'res / values ​​/ styles.xml', modifique o tema para seu aplicativo / atividade e adicione o seguinte estilo:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <item name="@attr/customTextViewStyle">@style/CustomTextView</item>
    </style>
    ... 
</resources>

Finalmente, no seu TextView personalizado, agora você pode usar o construtor com o atributo e ele receberá seu estilo

public class CustomTextView extends TextView {

    public CustomTextView(Context context) {
       super(context, null, R.attr.customTextView);
    }
}

Vale a pena notar que eu usei repetidamente customTextView em diferentes variantes e lugares diferentes, mas não é necessário que o nome da exibição corresponda ao estilo, ao atributo ou a qualquer coisa. Além disso, essa técnica deve funcionar com qualquer exibição personalizada, não apenas com TextViews.

Kevin Grant
fonte
5

Isso funcionou para mim

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

ou

textview.setTypeface(Typeface.DEFAULT_BOLD);
Ray Hunter
fonte
2

Eu o resolvi com dois métodos simples.

Siga a explicação.

Minha declaração de estilo existente:

<style name="SearchInfoText">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">24sp</item>
    <item name="android:textColor">@color/Church_Grey</item>
    <item name="android:shadowColor">@color/Shadow_Church</item>
    <item name="android:shadowRadius">3</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
</style>

Meu código Java do Android:

    TextView locationName = new TextView(getSupportActivity());
    locationName.setId(IdGenerator.generateViewId());
    locationName.setText(location.getName());
    locationName.setLayoutParams(super.centerHorizontal());
    locationName.setTextSize(24f);
    locationName.setPadding(0, 0, 0, 15);
    locationName.setTextColor(getResources().getColor(R.color.Church_Grey));
    locationName.setShadowLayer(3, 1, 1,  getResources().getColor(R.color.Shadow_Church));

Saudações.

andresmafra
fonte
0

Você pode tentar este

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                textView.setTextAppearance(R.style.Lato_Bold);
            } else {
                textView.setTextAppearance(getActivity(), R.style.Lato_Bold);
            }
insane_warewolf
fonte
0

Como setTextAppearance(resId)está disponível apenas para a API 23 e superior, use:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

Este método é implementado internamente da seguinte maneira:

public static void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
    if (Build.VERSION.SDK_INT >= 23) {
        textView.setTextAppearance(resId);
    } else {
        textView.setTextAppearance(textView.getContext(), resId);
    }
}
Rohan Taneja
fonte
-1

Conforme mencionado aqui , esse recurso não é suportado no momento.

dcanh121
fonte