Android: impostare TextView TextStyle a livello di codice?


232

C'è un modo per impostare il textStyle attributo di un TextViewprogrammaticamente? Non sembra esserci un setTextStyle()metodo.

Per essere chiari, non sto parlando di stili Visualizza / Widget! Sto parlando di quanto segue:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />

1
puoi fare riferimento sotto il link e bloccare la prima risposta top stackoverflow.com/questions/6200533/…
Tiep

Si prega di controllare la mia risposta qui . Spero che questo ti possa aiutare
Summved Jain,

Risposte:


410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface è l'attributo textStyle.

Come ha aggiunto Shankar V , per preservare gli attributi dei caratteri precedentemente impostati puoi usare:

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

14
dovrebbe esseretextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V

2
@IlyaEremin per conservare il carattere precedentemente impostato è necessario utilizzarlo in questo modo.
Sankar V,

Modificata la mia risposta in base al commento di @SankarV.
Raz,

13
Penso che dovresti perdere DEFAULT: holder.title.setTypeface (holder.title.getTypeface (), Typeface.BOLD);
Iman Akbari,

In realtà textview.getTypeface().getStyle()èandroid:textStyle
Pierre

126

Supponiamo che tu abbia uno stile chiamato RedHUGEText sui tuoi valori / 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>

Crea il tuo TextView come al solito nel file XML layout / your_layout.xml, diciamo:

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

E nel codice java della tua attività fai questo:

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

Ha funzionato per me! E ha applicato colore, dimensioni, gravità, ecc. L'ho usato su telefoni e tablet con livelli API Android da 8 a 17 senza problemi. Si noti che a partire da Android 23, questo metodo è stato deprecato. L'argomento del contesto è stato abbandonato, quindi l'ultima riga dovrebbe essere:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

Ricorda ... questo è utile solo se lo stile del testo dipende davvero da una condizione della tua logica Java o stai costruendo l'interfaccia utente "al volo" con il codice ... in caso contrario, è meglio semplicemente fare:

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

Puoi sempre farlo a modo tuo!


4
Ciò imposterà solo un sottoinsieme di attributi che possono essere definiti in un <style>tag. Fa quelli comuni (dimensioni, colore, stile), ma non ne applica altri (inclusi imbottitura, sfondo, gravità, ecc.)
kar

5
Sembra richiedere l'API minima 23?
William T. Mallard,

4
ci sono due metodi, uno per api <23 e uno per api 23+. Sembrano identici, tranne quello per <23 accetta un argomento contestuale e quello per 23+ no. Sotto il cofano, quello per api 23+ chiama il metodo per <23 e utilizza il contesto membro per la visualizzazione di testo.
Mr Plough,


52

Tanti modi per raggiungere questo obiettivo alcuni sono di seguito: -

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

o se vuoi attraverso xml

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

setTextAppearance () è la risposta che stavo cercando per applicare uno stile personalizzato definito nel mio XML. Grazie.
ashario,

Secondo me, questa è la risposta migliore per il thread. Molte opzioni per chiamare programmaticamente il codice
Nguyen Minh Hien,

9

Kotlin Version

Per conservare il carattere corrente oltre allo stile del testo:

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

7

Questa domanda viene posta in molti punti in molti modi diversi. Inizialmente ho risposto qui, ma ritengo sia rilevante anche in questo thread (da quando sono finito qui quando sono mentre cercavo una risposta).

Non esiste una soluzione a una linea per questo problema, ma ha funzionato per il mio caso d'uso. Il problema è che il costruttore 'View (context, attrs, defStyle)' non fa riferimento a uno stile reale, vuole un attributo. Quindi:

  1. Definire un attributo
  2. Crea uno stile che desideri utilizzare
  3. Applica uno stile per quell'attributo sul nostro tema
  4. Crea nuove istanze della nostra vista con quell'attributo

In "res / valori / attrs.xml", definisci un nuovo attributo:

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

In res / valori / styles.xml 'ho intenzione di creare lo stile che voglio usare sul mio TextView personalizzato

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

In "res / valori / temi.xml" o "res / valori / stili.xml", modifica il tema per la tua applicazione / attività e aggiungi il seguente stile:

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

Infine, nel tuo TextView personalizzato, ora puoi usare il costruttore con l'attributo e riceverà il tuo stile

public class CustomTextView extends TextView {

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

Vale la pena notare che ho usato ripetutamente customTextView in diverse varianti e luoghi diversi, ma non è in alcun modo necessario che il nome della vista corrisponda allo stile o all'attributo o altro. Inoltre, questa tecnica dovrebbe funzionare con qualsiasi vista personalizzata, non solo con TextViews.


5

Questo ha funzionato per me

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

o

textview.setTypeface(Typeface.DEFAULT_BOLD);

2

L'ho risolto con due semplici metodi.

Segui la spiegazione.

La mia dichiarazione di stile esistente:

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

Il mio codice Java per 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));

Saluti.


0

Puoi provare questo

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

0

Poiché setTextAppearance(resId)è disponibile solo per API 23 e successive, utilizzare:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

Questo metodo è implementato internamente come segue:

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

-1

Come accennato qui , questa funzione non è attualmente supportata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.