¿Cuál es el equivalente de "android: fontFamily =” sans-serif-light "en código Java?

106

Mi pregunta es bastante simple:

En cada una de mis vistas de texto, actualmente estoy usando el atributo

android:fontFamily="sans-serif-light"

para proporcionar una apariencia hermosa en dispositivos post HC.

Desafortunadamente, esto no funciona con todos los widgets y para mis Spinners, necesito sobrescribir el Adaptador.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //You can use the new tf here.

    if(convertView == null || convertView.getTag() == null) {
        // new view - populate 
        convertView = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);
        convertView.setTag(new Object());
    }

    CheckedTextView spinner_text=(CheckedTextView) convertView.findViewById(android.R.id.text1);
    //Typeface should be set here...
    return spinner_text;
    }
}

Entonces, ¿hay alguna manera de obtener exactamente el mismo resultado por código?

PD: No, no quiero poner un tipo de letra en la carpeta de activos, solo quiero usar el sistema uno.

Waza_Be
fuente

Respuestas:

168

Debería ser posible con setTypeface()y Typeface.create():

convertView.setTypeface(Typeface.create("sans-serif-light", Typeface.NORMAL));

Ver documentos :

Cree un objeto tipográfico con un apellido e información sobre el estilo de la opción. Si se pasa nulo para el nombre, se elegirá la fuente "predeterminada". El objeto tipográfico resultante puede consultarse ( getStyle()) para descubrir cuáles son sus características de estilo "reales".

Tenga en cuenta que el uso excesivo Typeface.create()es malo para su memoria, como se indica en este comentario . El Hashtable sugerido es una buena solución, pero debe modificarlo un poco ya que no crea su tipo de letra a partir de un activo.

Saschoar
fuente
2
Tenga cuidado con los problemas de memoria si tiene muchos elementos giratorios: actualicé un poco mi respuesta.
saschoar
44

Android 4.1 (API nivel 16) y biblioteca de soporte 26 y superior

Si está usando res -> carpeta de fuentes, puede usar así

  val typeface = ResourcesCompat.getFont(Context, R.font.YOUR_FONT)
  TextView.setTypeface(typeface)
murgupluoglu
fuente
20

En mi opinión, todavía hay una forma de aplicar las fuentes del sistema mediante programación en TextView sin tener ningún problema de memoria y es mediante el textview.setTextAppearancemétodo:

<style name="styleA">
    <item name="android:fontFamily">sans-serif</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textColor">?android:attr/textColorPrimary</item>
</style>
<style name="styleB">
    <item name="android:fontFamily">sans-serif-light</item>
    <item name="android:textStyle">normal</item>
    <item name="android:textColor">?android:attr/textColorTertiary</item>
</style>


if(condition){
    textView.setTextAppearance(context,R.style.styleA);
}else{
    textView.setTextAppearance(context,R.style.styleB);
}
Rahul Verma
fuente
2
android:fontFamilyrequiere API 16.
CoolMind
2
Utilice TextViewCompat.setTextAppearance(textView, R.style.styleA).
CoolMind
19

Dinámicamente, puede configurar fontfamily similar a android: fontFamily en xml usando esto,

For Custom font:

 TextView tv = ((TextView) v.findViewById(R.id.select_item_title));
 Typeface face=Typeface.createFromAsset(getAssets(),"fonts/mycustomfont.ttf"); 
 tv.setTypeface(face);

For Default font:

 tv.setTypeface(Typeface.create("sans-serif-medium",Typeface.NORMAL));

Esta es la lista de la familia de fuentes predeterminada utilizada, use cualquiera de esto reemplazando la cadena de comillas dobles "sans-serif-medium"

FONT FAMILY                    TTF FILE                    

1  casual                      ComingSoon.ttf              
2  cursive                     DancingScript-Regular.ttf   
3  monospace                   DroidSansMono.ttf           
4  sans-serif                  Roboto-Regular.ttf          
5  sans-serif-black            Roboto-Black.ttf            
6  sans-serif-condensed        RobotoCondensed-Regular.ttf 
7  sans-serif-condensed-light  RobotoCondensed-Light.ttf   
8  sans-serif-light            Roboto-Light.ttf            
9  sans-serif-medium           Roboto-Medium.ttf           
10  sans-serif-smallcaps       CarroisGothicSC-Regular.ttf 
11  sans-serif-thin            Roboto-Thin.ttf             
12  serif                      NotoSerif-Regular.ttf       
13  serif-monospace            CutiveMono.ttf              

"mycustomfont.ttf" es el archivo ttf. La ruta estará en src / assets / fonts / mycustomfont.ttf , puede consultar más sobre la fuente predeterminada en esta familia de fuentes predeterminada

anand krish
fuente
13

Opción 1 : API 26 y superior

// Jave
Typeface typeface = getResources().getFont(R.font.myfont);
textView.setTypeface(typeface);

// Kotlin
val typeface = resources.getFont(R.font.myfont)
textView.typeface = typeface

Opción 2 : API 16 y superior

// Java
Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);

// Kotlin
val typeface = ResourcesCompat.getFont(context, R.font.myfont)

Consulte la expiación completa en la Guía para desarrolladores de Android .

Pronto Santos
fuente
6

Sería posible usando

setTypeface(Typeface tf, int style)método de TextViewclase.

spinner_text.setTypeface(Typeface.SANS_SERIF,Typeface.NORMAL);

Vikas Gaurav
fuente