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.
- Obtener id de recurso desde la vista que se infló
- Código de lengua para flamenco
- Método getResourceId de TypedArray
- Recursos de Android $ NotFoundException: Resource ID # 0x7f030027
- Android define el color de fondo en TextView en styles.xml
Como resumen: ¿Cómo puedo acceder a 'un archivo de carpeta de activos' en XML?
- No se puede crear una carpeta 'res / transition' después de actualizar SDK a Kitkat 4.4.2
- Inclusión / exclusión de recursos condicionales para Android apk build
- Los recursos no traducibles sólo deben definirse en los valores base / carpeta - Android Export APK
- Creación de aplicaciones con CrossWalk incorporado
- Error: no se puede encontrar la variable de símbolo abc_ic_ab_back_mtrl_am_alpha
- ¿Es posible usar subcarpetas en drawables en Android?
- ¿Cómo usar los tipos de compilación (depuración vs liberación) para establecer diferentes estilos y nombres de aplicaciones?
- GetResources (). GetColor () está obsoleto
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.
- Implementación de las pestañas ActionBar con v4 Fragments API
- Android getActivity () no está definido