Android – Uso de fuente personalizada

TextView una fuente personalizada a un TextView , pero no parece cambiar el tipo de letra.

Aquí está mi código:

  Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf"); TextView myTextView = (TextView)findViewById(R.id.myTextView); myTextView.setTypeface(myTypeface); 

¿Alguien puede sacarme de este problema?

En Mobiletuts + hay muy buen tutorial sobre el formato de texto para Android. Consejo rápido: personaliza las fonts de Android

EDITAR: Lo probé yo mismo ahora. Aquí está la solución. Puede usar una subcarpeta llamada fonts, pero debe ir en la carpeta de assets no en la carpeta de res . Asi que

activos / fonts

También asegúrese de que la terminación de la fuente me refiero a la finalización del archivo de la fuente en minúsculas. En otras palabras, no debería ser myFont.TTF pero myfont.ttf debe estar en minúsculas

Después de probar la mayoría de las soluciones descritas en este hilo, accidentalmente encontré Calligraphy ( https://github.com/chrisjenx/Calligraphy ), una biblioteca de Christopher Jenkins que le permite agregar fácilmente fonts personalizadas a su aplicación. Las ventajas de su lib comparando con los enfoques sugeridos aquí son:

  1. no tiene que introducir su propio componente TextView anulado, usa el TextView incorporado
  2. puedes incluir fácilmente la biblioteca usando gradle
  3. La biblioteca no limita su elección de fonts; simplemente agrega los preferidos al directorio de activos
  4. no solo obtendrá vistas de texto personalizadas; todos los demás componentes de Android basados ​​en texto también se mostrarán con su fuente personalizada.

Sé que ya hay buenas respuestas, pero aquí hay una implementación completamente funcional.

Aquí está la vista de texto personalizada:

 package com.mycompany.myapp.widget; /** * Text view with a custom font. * 

* In the XML, use something like {@code customAttrs:customFont="roboto-thin"}. The list of fonts * that are currently supported are defined in the enum {@link CustomFont}. Remember to also add * {@code xmlns:customAttrs="http://schemas.android.com/apk/res-auto"} in the header. */ public class CustomFontTextView extends TextView { private static final String sScheme = "http://schemas.android.com/apk/res-auto"; private static final String sAttribute = "customFont"; static enum CustomFont { ROBOTO_THIN("fonts/Roboto-Thin.ttf"), ROBOTO_LIGHT("fonts/Roboto-Light.ttf"); private final String fileName; CustomFont(String fileName) { this.fileName = fileName; } static CustomFont fromString(String fontName) { return CustomFont.valueOf(fontName.toUpperCase(Locale.US)); } public Typeface asTypeface(Context context) { return Typeface.createFromAsset(context.getAssets(), fileName); } } public CustomFontTextView(Context context, AttributeSet attrs) { super(context, attrs); if (isInEditMode()) { return; } else { final String fontName = attrs.getAttributeValue(sScheme, sAttribute); if (fontName == null) { throw new IllegalArgumentException("You must provide \"" + sAttribute + "\" for your text view"); } else { final Typeface customTypeface = CustomFont.fromString(fontName).asTypeface(context); setTypeface(customTypeface); } } } }

Aquí están los atributos personalizados. Esto debería ir a su archivo res/attrs.xml :

       

Y así es como lo usas. customAttr un diseño relativo para customAttr y mostrar la statement personalizada de customAttr , pero obviamente podría ser cualquier diseño que ya tengas.

    

Lo he usado con éxito antes. La única diferencia entre nuestras implementaciones es que no estaba usando una subcarpeta en activos. Sin embargo, no estoy seguro si eso cambiará algo.

Siempre que haya colocado la fuente en el lugar correcto y no haya ningún error en el archivo de fuente, su código debería funcionar así, RATTLESNAKE.

Sin embargo, sería mucho más fácil si pudieras simplemente definir una fuente en tu diseño xml, así:

         

Con los res/values/styles.xml :

               

Creé un par de herramientas específicamente para este propósito. Consulte este proyecto desde GitHub, o eche un vistazo a esta publicación de blog que explica todo.

Para las fonts personalizadas en android, cree una carpeta dentro del nombre de la carpeta de recursos, “fonts”, coloque el archivo fonts.ttf o .otf que desee.

Si extiende UIBaseFragment:

 Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Arial.ttf"); tv.setTypeface(font); 

si se extiende la actividad:

 Typeface font = Typeface.createFromAsset(getContext().getAssets(), "fonts/Arial.ttf"); tv.setTypeface(font); 

La mejor forma de hacerlo Desde el lanzamiento de vista previa de Android O es de esta manera:

Funciona solo si tienes android studio-2.4 o superior

  1. Haga clic derecho en la carpeta res y vaya a Nuevo> directorio de recursos de Android . El nuevo
    La ventana del Directorio de Recursos aparece.
  2. En la lista Tipo de recurso, seleccione fuente y luego haga clic en Aceptar.
  3. Agregue sus archivos de fonts en la carpeta de fonts . La estructura de carpetas a continuación genera R.font.dancing_script , R.font.la_la y R.font.ba_ba .
  4. Haga doble clic en un archivo de fuente para obtener una vista previa de las fonts del archivo en el editor.

A continuación, debemos crear una familia de fonts:

  1. Haga clic derecho en la carpeta de fonts y vaya a Nuevo> Archivo de recursos de fonts . Aparece la ventana Nuevo archivo de recursos.
  2. Ingrese el Nombre del archivo y luego haga clic en Aceptar . El nuevo XML de recurso de fuente se abre en el editor.
  3. Adjunte cada archivo de fuente, estilo y atributo de peso en el elemento de etiqueta de fuente. El siguiente XML ilustra la adición de atributos relacionados con la fuente en el XML de recursos de fonts:

Agregar fonts a un TextView:

   

A partir de la documentación

Trabajando con fonts

Todos los pasos son correctos.

Puede usar PixlUI en https://github.com/neopixl/PixlUI

importar su .jar y usarlo en XML

   

Dado que no estaba satisfecho con todas las soluciones presentadas en SO, he encontrado la mía. Se basa en un pequeño truco con tags (es decir, no puedes usar tags en tu código), puse la ruta de la fuente allí. Entonces, al definir vistas, puede hacer esto:

  

o esto:

   

Ahora puede acceder / configurar explícitamente la vista como:

 TextView textView = TextViewHelper.setupTextView(this, R.id.textViewHello1).setText("blah"); 

o simplemente configura todo a través de:

 TextViewHelper.setupTextViews(this, (ViewGroup) findViewById(R.id.parentLayout)); // parentLayout is the root view group (relative layout in my case) 

¿Y cuál es la clase de magia que preguntas? Mayormente pegado de otras publicaciones de SO, con métodos de ayuda para la actividad y los fragmentos:

 import android.app.Activity; import android.content.Context; import android.graphics.Typeface; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.HashMap; import java.util.Map; public class TextViewHelper { private static final Map mFontCache = new HashMap<>(); private static Typeface getTypeface(Context context, String fontPath) { Typeface typeface; if (mFontCache.containsKey(fontPath)) { typeface = mFontCache.get(fontPath); } else { typeface = Typeface.createFromAsset(context.getAssets(), fontPath); mFontCache.put(fontPath, typeface); } return typeface; } public static void setupTextViews(Context context, ViewGroup parent) { for (int i = parent.getChildCount() - 1; i >= 0; i--) { final View child = parent.getChildAt(i); if (child instanceof ViewGroup) { setupTextViews(context, (ViewGroup) child); } else { if (child != null) { TextViewHelper.setupTextView(context, child); } } } } public static void setupTextView(Context context, View view) { if (view instanceof TextView) { if (view.getTag() != null) // also inherited from TextView's style { TextView textView = (TextView) view; String fontPath = (String) textView.getTag(); Typeface typeface = getTypeface(context, fontPath); if (typeface != null) { textView.setTypeface(typeface); } } } } public static TextView setupTextView(View rootView, int id) { TextView textView = (TextView) rootView.findViewById(id); setupTextView(rootView.getContext().getApplicationContext(), textView); return textView; } public static TextView setupTextView(Activity activity, int id) { TextView textView = (TextView) activity.findViewById(id); setupTextView(activity.getApplicationContext(), textView); return textView; } } 

Lamentablemente, no hay una buena solución para esto.

He visto muchos artículos sobre el uso de una vista de texto personalizada, pero lo que olvidan es que no solo las vistas de texto pueden implementar las fonts y que hay vistas de texto ocultas en otras vistas inaccesibles para el desarrollador; Ni siquiera voy a comenzar con Spannable .

Puede usar una utilidad de fuente externa como:

Herramienta de fuente de caligrafía

PERO Esto recorre todas las vistas de la aplicación en su creación e incluso esta utilidad omite algunas vistas (ViewPager renderiza la fuente normal) entonces usted tiene el problema de que cuando Google actualice sus herramientas de comstackción esto se bloqueará ocasionalmente porque necesita apuntar a las propiedades obsoletas. También es un poco lento ya que utiliza la reflexión de Java .

Depende de Google arreglar esto. Necesitamos un mejor soporte de fonts en Android. Si miras la solución de iOS, literalmente tienen cientos de fonts integradas para seleccionar. ¿Quieres una fuente personalizada? Simplemente suelta un TFF y se puede usar.

Por ahora, ahora estamos limitados a la oferta que Google nos ofrece, que es extremadamente limitada pero afortunadamente optimizada para dispositivos móviles.

Asegúrese de pegar el código anterior en onCreate () después de su llamada al super y la llamada a setContentView (). Este pequeño detalle me mantuvo colgado por un tiempo.

Con Android 8.0, el uso de Custom Fonts en Application se hizo más fácil con las downloadable fonts . Podemos agregar fonts directamente a la res/font/ folder en la res/font/ folder del proyecto, y al hacerlo, las fonts estarán automáticamente disponibles en Android Studio.

Carpeta Bajo res con nombre de fuente y tipo establecido en Fuente

Ahora configure el atributo fontFamily en la lista de fonts o haga clic en más y seleccione la fuente de su elección. Esto agregará tools:fontFamily="@font/your_font_file" a tu TextView.

Esto generará automáticamente pocos archivos.

1. En la carpeta de valores, creará fonts_certs.xml .

2. En Manifiesto agregará estas líneas:

   

3. preloaded_fonts.xml

   @font/open_sans_regular @font/open_sans_semibold   

Tuve el mismo problema, el TTF no apareció. Cambié el archivo de fuente, y con el mismo código está funcionando.

Si desea cargar la fuente desde la red o modelarla fácilmente, puede usar:

https://github.com/shellum/fontView

Ejemplo:

   //Java: fontView.setupFont("http://blah.com/myfont.ttf", true, character, FontView.ImageType.CIRCLE); fontView.addForegroundColor(Color.RED); fontView.addBackgroundColor(Color.WHITE); 

Bueno, después de siete años puedes cambiar toda la aplicación textView o lo que quieras fácilmente usando las bibliotecas android.support 26 ++.

P.ej:

Cree su aplicación de paquete de fonts / src / res / font y mueva su fuente en ella.

enter image description here

Y en el tema de su aplicación, solo agréguelo como fontFamily:

   

Ejemplo para usar solo con textView :

  

Y añádelo a tu tema principal:

 @style/fontTextView 

Actualmente funciona en 8.1 hasta 4.1 API Jelly Bean Y eso es un amplio rango.

Respuesta de actualización: Android 8.0 (API de nivel 26) presenta una nueva característica, Fuentes en XML. solo use la función Fuentes en XML en dispositivos con Android 4.1 (nivel de API 16) y superior, use la Biblioteca de soporte 26.

ver este enlace


Respuesta anterior

Hay dos formas de personalizar fonts:

!!! mi fuente personalizada en assets / fonts / iran_sans.ttf

Modo 1: Refrection Typeface.class

mejor manera

llamada FontsOverride.setDefaultFont () en la clase extends Application, Este código hará que cambien todas las fonts de software, incluso las fonts de Toasts

AppController.java

 public class AppController extends Application { @Override public void onCreate() { super.onCreate(); //Initial Font FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf"); } } 

FontsOverride.java

 public class FontsOverride { public static void setDefaultFont(Context context, String staticTypefaceFieldName, String fontAssetName) { final Typeface regular = Typeface.createFromAsset(context.getAssets(), fontAssetName); replaceFont(staticTypefaceFieldName, regular); } private static void replaceFont(String staticTypefaceFieldName, final Typeface newTypeface) { try { final Field staticField = Typeface.class.getDeclaredField(staticTypefaceFieldName); staticField.setAccessible(true); staticField.set(null, newTypeface); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } 

Modo 2: use setTypeface

para una vista especial simplemente llame a setTypeface () para cambiar la fuente.

CTextView.java

 public class CTextView extends TextView { public CTextView(Context context) { super(context); init(context,null); } public CTextView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context,attrs); } public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context,attrs); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(context,attrs); } public void init(Context context, @Nullable AttributeSet attrs) { if (isInEditMode()) return; // use setTypeface for change font this view setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf")); } } 

FontUtils.java

 public class FontUtils { private static Hashtable fontCache = new Hashtable<>(); public static Typeface getTypeface(String fontName) { Typeface tf = fontCache.get(fontName); if (tf == null) { try { tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName); } catch (Exception e) { e.printStackTrace(); return null; } fontCache.put(fontName, tf); } return tf; } } 

Puede usar la sencilla y sencilla biblioteca de terceros EasyFonts para establecer una variedad de fonts personalizadas para su TextView . Al usar esta biblioteca, no debe preocuparse por descargar y agregar fonts en la carpeta assets / fonts. También sobre la creación de objetos Tipo de letra.

En lugar de

 Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf"); TextView myTextView = (TextView)findViewById(R.id.myTextView); myTextView.setTypeface(myTypeface); 

Simplemente:

 TextView myTextView = (TextView)findViewById(R.id.myTextView); myTextView.setTypeface(EasyFonts.robotoThin(this)); 

Esta biblioteca también proporciona la siguiente cara de fuente.

  • Roboto
  • Droid Serif
  • Robot Droid
  • Libertad
  • Fun Raiser
  • Android Nation
  • Aguacate verde
  • Reconocimiento

Soy el autor de esta biblioteca.

La forma correcta de hacerlo a partir de API 26 se describe en la documentación oficial aquí:

https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

Esto implica colocar los archivos ttf en la carpeta res / font y crear un archivo de familia de fonts.

¡La solución más simple compatible con Android ahora!

Use una fuente personalizada en xml:

  

ver detalles:

https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

  • Abra su proyecto y seleccione Proyecto en la esquina superior izquierda
  • aplicación -> src -> main
  • haga clic derecho en main y cree el nombre del directorio como activo
  • haga clic derecho para evaluar y crear un nuevo nombre de directorio it fonts
  • necesitas encontrar fonts gratuitas como fonts gratuitas
  • entrégalo a tu Textview y llámalo en tu clase Activity
  • copie sus fonts dentro de la carpeta de fonts
  • TextView txt = (TextView) findViewById(R.id.txt_act_spalsh_welcome); Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Aramis Italic.ttf"); txt.setTypeface(font);

el nombre de la fuente debe ser correcto y divertirse

Sí, las fonts descargables son muy fáciles, como dijo Dipali .

Así es como lo haces …

  1. Coloque un TextView .
  2. En el panel de propiedades, seleccione el fontFamily desplegable fontFamily . Si no está allí, busque la carátula del cursor (la> y haga clic en ella para expandir el texto textAppearance ) debajo de.
  3. Expanda el menú desplegable de la font-family .
  4. En la pequeña lista, desplácese hacia abajo hasta que vea more fonts
  5. Esto abrirá un cuadro de diálogo donde puede buscar desde Google Fonts
  6. Busque la fuente que desee con la barra de búsqueda en la parte superior
  7. Seleccione su fuente
  8. Seleccione el estilo de la fuente que le gusta (es decir, negrita, normal, cursiva, etc.)
  9. En el panel derecho, elija el botón de opción que dice Add font to project
  10. Haga clic en Aceptar ¡Ahora tu TextView tiene la fuente que te gusta!

BONIFICACIÓN: si desea @font/fontnamehere TODO con texto en su aplicación con la fuente elegida, simplemente agregue @font/fontnamehere en su styles.xml