Android: ¿establecer TextView TextStyle mediante programación?

232

¿Hay alguna manera de establecer el textStyleatributo de un TextViewprogramáticamente? No parece haber un setTextStyle()método.

Para ser claros, ¡no estoy hablando de los estilos Ver / Widget! Estoy hablando de lo siguiente:

<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
fuente
1
puede hacer referencia al siguiente enlace y bloquear la respuesta de la parte superior 1 stackoverflow.com/questions/6200533/…
Tiep
Por favor revisa mi respuesta aquí . Espero que esto te ayude
Summved Jain

Respuestas:

410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface es el atributo textStyle.

Como agregó Shankar V , para preservar los atributos de tipo de letra establecidos previamente puede usar:

textview.setTypeface(textview.getTypeface(), Typeface.BOLD);
Raz
fuente
14
debería sertextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V
2
@IlyaEremin para preservar la fuente establecida previamente, necesita usarla así.
Sankar V
Edité mi respuesta basada en el comentario de @SankarV.
Raz
13
Creo que debería perder el PREDETERMINADO: holder.title.setTypeface (holder.title.getTypeface (), Typeface.BOLD);
Iman Akbari
En realidad textview.getTypeface().getStyle()esandroid:textStyle
Pierre
126

Digamos que tiene un estilo llamado RedHUGEText en sus valores / 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>

Simplemente cree su TextView como de costumbre en el archivo 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" />

Y en el código de Java de tu Actividad haces esto:

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

¡Funcionó para mí! Y aplicó color, tamaño, gravedad, etc. Lo he usado en teléfonos y tabletas con niveles de API de Android de 8 a 17 sin problemas. Tenga en cuenta que a partir de Android 23, ese método ha quedado en desuso. El argumento de contexto se ha eliminado, por lo que la última línea debería ser:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

Recuerde ... esto es útil solo si el estilo del texto realmente depende de una condición en su lógica Java o si está construyendo la interfaz de usuario "sobre la marcha" con código ... si no lo hace, es mejor simplemente hacer:

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

¡Siempre puedes tenerlo a tu manera!

Oscar Salguero
fuente
44
Esto solo establecerá un subconjunto de atributos que se pueden definir en una <style>etiqueta. Hace los comunes (tamaño, color, estilo), pero no aplica otros (incluyendo relleno, fondo, gravedad, etc.)
karl
55
Parece requerir min API 23?
William T. Mallard
44
Hay dos métodos, uno para la API <23 y otro para la API 23+. Parecen idénticos, excepto que el de <23 toma un argumento de contexto y el de 23+ no. Debajo del capó, el de api 23+ llama al método para <23 y usa el contexto del miembro para la vista de texto.
MrPlow
52

Hay muchas maneras de lograr esta tarea, algunas están a continuación:

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 si quieres a través de xml

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"
duggu
fuente
setTextAppearance () es la respuesta que buscaba para aplicar un estilo personalizado definido en mi XML. Gracias.
ashario
En mi opinión, esta es la mejor respuesta para el hilo. Muchas opciones para llamar mediante programación en código
Nguyen Minh Hien
9

Kotlin Version

Para conservar la fuente actual además del estilo de texto:

textView.apply {
    setTypeface(typeface, Typeface.NORMAL)
    // or
    setTypeface(typeface, Typeface.BOLD)
    // or
    setTypeface(typeface, Typeface.ITALIC)
    // or
    setTypeface(typeface, Typeface.BOLD_ITALIC)
}
aminografía
fuente
7

Esta pregunta se hace en muchos lugares de muchas maneras diferentes. Originalmente lo respondí aquí, pero siento que también es relevante en este hilo (ya que terminé aquí cuando estaba buscando una respuesta).

No hay una solución de línea para este problema, pero esto funcionó para mi caso de uso. El problema es que el constructor 'View (context, attrs, defStyle)' no se refiere a un estilo real, quiere un atributo. Entonces, nosotros:

  1. Definir un atributo
  2. Crea un estilo que quieras usar
  3. Aplicar un estilo para ese atributo en nuestro tema
  4. Cree nuevas instancias de nuestra vista con ese atributo

En 'res / values ​​/ attrs.xml', defina un nuevo atributo:

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

En res / values ​​/ styles.xml 'voy a crear el estilo que quiero usar en mi 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>

En 'res / values ​​/ themes.xml' o 'res / values ​​/ styles.xml', modifique el tema para su aplicación / actividad y agregue el siguiente estilo:

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

Finalmente, en su TextView personalizado, ahora puede usar el constructor con el atributo y recibirá su estilo

public class CustomTextView extends TextView {

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

Vale la pena señalar que usé repetidamente customTextView en diferentes variantes y diferentes lugares, pero de ninguna manera se requiere que el nombre de la vista coincida con el estilo o el atributo ni nada. Además, esta técnica debería funcionar con cualquier vista personalizada, no solo TextViews.

Kevin Grant
fuente
5

Esto funciono para mi

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

o

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

Lo he resuelto con dos métodos simples.

Sigue la explicación.

Mi declaración 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>

Mi código de Android Java:

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

Saludos.

andresmafra
fuente
0

Puedes probar 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
fuente
0

Como setTextAppearance(resId)solo está disponible para API 23 y superior, use:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

Este método se implementa internamente de la siguiente manera:

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

Como se mencionó aquí , esta característica no es compatible actualmente.

dcanh121
fuente