Acceso a una fuente en la carpeta de activos del archivo XML de Android

Estoy tratando de hacer un cambio de fuente de toda la aplicación y crear un archivo de estilo para hacerlo. En este archivo (abajo) sólo quiero cambiar el valor de tipo de letra de estilo TextAppearance de Android.

<?xml version="1.0" encoding="utf-8"?> <resources> <style name="NightRiderFont" parent="@android:style/TextAppearance"> <item name="android:typeface"> /***help need here***/ </item> </style> </resources> 

Sin embargo, la fuente está en "assets / fonts /". ¿Cómo puedo acceder a esta fuente, por lo que puedo utilizar ese estilo como un tema para deshacerse de cambiar todas las TextViews a mano programáticamente.

Como resumen: ¿Cómo puedo acceder a 'un archivo de carpeta de activos' en XML?

En mi investigación, no hay manera de agregar fuentes externas al archivo xml. Sólo la fuente predeterminada 3 está disponible en xml

Pero puedes usarlo en java usando este código.

 Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/verdana.ttf"); textfield.setTypeface(tf,Typeface.BOLD); 

Actualizar:

Ahora encuentro una manera de hacer esto creando una clase de encargo que extiende el TextView y uso eso en el archivo del xml.

 public class TextViewWithFont extends TextView { private int defaultDimension = 0; private int TYPE_BOLD = 1; private int TYPE_ITALIC = 2; private int FONT_ARIAL = 1; private int FONT_OPEN_SANS = 2; private int fontType; private int fontName; public TextViewWithFont(Context context) { super(context); init(null, 0); } public TextViewWithFont(Context context, AttributeSet attrs) { super(context, attrs); init(attrs, 0); } public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(attrs, defStyle); } private void init(AttributeSet attrs, int defStyle) { // Load attributes final TypedArray a = getContext().obtainStyledAttributes( attrs, R.styleable.font, defStyle, 0); fontName = a.getInt(R.styleable.font_name, defaultDimension); fontType = a.getInt(R.styleable.font_type, defaultDimension); a.recycle(); MyApplication application = (MyApplication ) getContext().getApplicationContext(); if (fontName == FONT_ARIAL) { setFontType(application .getArialFont()); } else if (fontName == FONT_OPEN_SANS) { setFontType(application .getOpenSans()); } } private void setFontType(Typeface font) { if (fontType == TYPE_BOLD) { setTypeface(font, Typeface.BOLD); } else if (fontType == TYPE_ITALIC) { setTypeface(font, Typeface.ITALIC); } else { setTypeface(font); } } } 

Y en xml

 <com.example.customwidgets.TextViewWithFont font:name="Arial" font:type="bold" android:layout_width="wrap_content" android:text="Hello world " android:padding="5dp" android:layout_height="wrap_content"/> 

No se olvide de agregar el esquema en la raíz de su xml

 xmlns:font="http://schemas.android.com/apk/res-auto" 

Y crear un archivo attrs.xml dentro del directorio de values , que contiene nuestros atributos personalizados:

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="font"> <attr name="type"> <enum name="bold" value="1"/> <enum name="italic" value="2"/> </attr> <attr name="name"> <enum name="Arial" value="1"/> <enum name="OpenSans" value="2"/> </attr> </declare-styleable> </resources> 

Actualizar:

Se ha encontrado un problema de rendimiento cuando se utiliza esta vista personalizada en listview, es decir, porque la fuente Object está creando cada vez que se carga la vista. La solución que encontré es inicializar la fuente en la clase de la aplicación y referir ese objeto de la fuente por

 MyApplication application = (MyApplication) getContext().getApplicationContext(); 

La clase de aplicación se verá así

 public class MyApplication extends Application { private Typeface arialFont, openSans; public void onCreate() { super.onCreate(); arialFont = Typeface.createFromAsset(getAssets(), QRUtils.FONT_ARIAL); openSans = Typeface.createFromAsset(getAssets(), QRUtils.FONT_OPEN_SANS); } public Typeface getArialFont() { return arialFont; } public Typeface getOpenSans() { return openSans; } } 

Editar 2:

Finalmente las fuentes son compatibles con xml (también compatible con versiones anteriores a través de la biblioteca de soporte): https://developer.android.com/preview/features/fonts-in-xml.html


Editar:

Ahora uso la biblioteca de Caligrafía . Es la forma más fácil para las fuentes personalizadas.

Qué puedes hacer:

  • Fuente personalizada en un TextView
  • Fuente personalizada en TextAppearance
  • Fuente personalizada en estilos
  • Fuente personalizada en Temas
  • FontSpannable para aplicar sólo la fuente a una parte del texto

Encontré otra manera de hacer esto.

Tienes que hacer tu propio TextView usando este tutorial

No es tan difícil y después de esto sólo puede utilizar TextView con su propia fuente.

No sé si alguien sigue observando esto, pero pensé que podría ayudar.

Utiliza esta función si utiliza una sola fuente.

 public static void applyFont(final Context context, final View root, final String fontName) { try { if (root instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) root; for (int i = 0; i < viewGroup.getChildCount(); i++) applyFont(context, viewGroup.getChildAt(i), fontName); } else if (root instanceof TextView) ((TextView) root).setTypeface(Typeface.createFromAsset(context.getAssets(), fontName)); } catch (Exception e) { Log.e("ProjectName", String.format("Error occured when trying to apply %s font for %s view", fontName, root)); e.printStackTrace(); } } 

Soorya tiene razón, pero si tienes que poner la misma fuente en muchas textViews, te recomiendo que coloques ese código dentro de un método estático que devuelva el Typeface deseado. Se reducirá las líneas en su código. O incluso mejor crear una clase que extiende la aplicación y hacer un método GET que devuelven la tipografía. Ese método será accesible desde cualquier actividad dentro de su aplicación (sin necesidad de utilizar variables estáticas o métodos estáticos).

Cambio de fuente es la funcionalidad muy básica en Android que es mayormente necesario para cada aplicación. Así que cada uno quiere cambiar sólo una vez en la aplicación que reducen nuestro tiempo de desarrollo por lo que le sugiero que vea este enlace FountChanger.class .

Espero que el uso completo para usted: –

 TextView text = (TextView) findViewById(R.id.custom_font); Typeface font = Typeface.createFromAsset(getAssets(), "yourfont.ttf"); text.setTypeface(font); 

Puede utilizar esta biblioteca: https://github.com/chrisjenx/Calligraphy

Sólo tiene que agregar la fuente que desea utilizar en su diseño. Me gusta esto:

 <TextView fontPath="fonts/verdana.ttf" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

Usted acaba de hacer llamadas públicas y adjunto Método como este

 public class TextViewFontType { public Typeface typeface; public void fontTextView(final TextView textView, final String fonttype) { typeface = Typeface.createFromAsset(textView.getContext().getAssets(), fonttype); textView.setTypeface(typeface); } 

¿Ha utilizado cualquier método TextView set font-family.

 public class FontList { public static final String gothicbNormal="fonts/gothicb.ttf"; public static final String gothicbBold="fonts/gothicb.ttf"; } 

Hecho FontList calss después de que usted acaba de llamar métodos cualquier donde con el paso dos parámetro.

Tomé la respuesta del niño de droid y lo hice funcionar con CUALQUIER fuente, apenas tecleando el nombre de fuente directamente en el XML:

Layout.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" > <!-- where font file is at "assets/fonts/arial.ttf" --> <com.odbol.widgets.TextViewWithFont ... custom:fontFilePath="fonts/arial.ttf" /> </RelativeLayout> 

Fonts.java

 public class Fonts { // use Weak so fonts are freed from memory when you stop using them private final static Map<String, Typeface> fonts = new WeakHashMap<>(5); /*** * Returns a font at the given path within the assets directory. * * Caches fonts to save resources. * * @param context * @param fontPath Path to a font file relative to the assets directory, eg "fonts/Arial.ttf" * @return */ public synchronized static Typeface getFont(Context context, String fontPath) { Typeface font = fonts.get(fontPath); if (font == null) { font = Typeface.createFromAsset(context.getAssets(), fontPath); fonts.put(fontPath, font); } return font; } } 

Valores / attrs.xml

 <resources> <declare-styleable name="TextViewWithFont"> <!-- a path to a font, relative to the assets directory --> <attr name="fontFilePath" format="string" /> <attr name="type"> <enum name="bold" value="1"/> <enum name="italic" value="2"/> </attr> </declare-styleable> </resources> 

TextViewWithFont.java

 public class TextViewWithFont extends TextView { private int defaultDimension = 0; private int TYPE_BOLD = 1; private int TYPE_ITALIC = 2; private int fontType; private int fontName; public TextViewWithFont(Context context) { super(context); init(null, 0); } public TextViewWithFont(Context context, AttributeSet attrs) { super(context, attrs); init(attrs, 0); } public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(attrs, defStyle); } private void init(AttributeSet attrs, int defStyle) { // Load attributes final TypedArray a = getContext().obtainStyledAttributes( attrs, R.styleable.TextViewWithFont, defStyle, 0); String fontPath = a.getString(R.styleable.TextViewWithFont_fontFilePath); fontType = a.getInt(R.styleable.TextViewWithFont_type, defaultDimension); a.recycle(); if (fontPath != null) { setFontType(Fonts.getFont(getContext(), fontPath)); } } private void setFontType(Typeface font) { if (fontType == TYPE_BOLD) { setTypeface(font, Typeface.BOLD); } else if (fontType == TYPE_ITALIC) { setTypeface(font, Typeface.ITALIC); } else { setTypeface(font); } } } 

1.Fisrt podemos agregar la carpeta de los activos> en que su styles.ttfs de la fuente en su app entonces
Código de acceso 2.write para las fuentes en cadenas como:

 <string name="fontregular">OpenSans-Light.ttf</string> <string name="fontmedium">OpenSans-Regular.ttf</string> 

3.Accessing algún código de textview del archivo del formato xml como esto abajo:

  <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:fontFamily="@string/fontregular" android:textColor="@color/normalfont" android:textSize="@dimen/textregular"/> 

4.Add dimensiones para el tamaño de la fuente:

  <dimen name="textregular">14sp</dimen> <dimen name="textheader">16sp</dimen> <dimen name="smalltext">12sp</dimen> <dimen name="littletext">10sp</dimen> <dimen name="hightfont">18sp</dimen> 

5.Add color de la fuente en colores:

  <color name="normalfont">#666</color> <color name="headerfont">#333</color> <color name="aquablue">#4da8e3</color> <color name="orange">#e96125</color> 

6.Then aplicar cambios es fácil proceso para cambiar la aplicación agujero. Codificación feliz mantener la sonrisa ..

Puede acceder a su archivo de fuentes desde la carpeta de activos al archivo xml.

Android: fontFamily = "fuentes / roboto_regular.ttf"

Fuentes es la carpeta secundaria en la carpeta de activos.

  • Establecer android: windowIsFloating programmatically
  • Android: ¿Por qué getDimension y getDimensionPixelSize devuelven lo mismo?
  • ¿Es R.layout.listview es lo mismo que R.id.listview
  • ¿Cómo incluir 2 variantes del idioma serbio? Con letras latinas y con letras cirílicas
  • Roboeléctrico con test.R.java
  • Cómo utilizar recursos enteros dentro de recursos de cadena en android
  • Almacenar datos estáticos en Android - recurso personalizado?
  • No se puede encontrar el recurso, No se identifica el elemento que falta
  • R no se puede resolver - Error de Android
  • Android: Estándares para prefijar archivos en el directorio RES aparte de ic_?
  • ¿Dónde está la documentación del elemento `<attr>` de XML de recursos de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.