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" />

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

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!


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


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"

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

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.


5

Isso funcionou para mim

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

ou

textview.setTypeface(Typeface.DEFAULT_BOLD);

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.


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

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

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.