font - Accediendo a una fuente en la carpeta de activos desde un archivo XML en Android
font xml (12)
1.Fisrt podemos agregar una carpeta de recursos> en la que su fuente styles.ttfs en su aplicación luego
2. escriba el código de acceso para las fuentes en cadenas como:
<string name="fontregular">OpenSans-Light.ttf</string>
<string name="fontmedium">OpenSans-Regular.ttf</string>
3. Accediendo a algún código de vista de texto del archivo XML de diseño como este a continuación:
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@string/fontregular"
android:textColor="@color/normalfont"
android:textSize="@dimen/textregular"/>
4. Añadir dimensiones para el tamaño de 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. Añadir color de fuente en colores:
<color name="normalfont">#666</color>
<color name="headerfont">#333</color>
<color name="aquablue">#4da8e3</color>
<color name="orange">#e96125</color>
6. Luego, aplicar los cambios es un proceso fácil para cambiar la aplicación del agujero. Feliz codificación sigue sonriendo.
Estoy tratando de hacer un cambio de fuente en toda la aplicación y crear un archivo de estilo para hacerlo. En este archivo (a continuación) solo quiero cambiar el valor del tipo de letra del estilo de AppAppearance 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 "asset / fonts /". ¿Cómo puedo acceder a esta fuente, por lo que puedo usar ese estilo como un tema para deshacerme de cambiar todos los TextViews a mano programáticamente?
Como resumen: ¿Cómo puedo acceder a ''un archivo de la carpeta de activos'' en XML?
Acabas 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);
}
¿Has usado algún método donde TextView establece la familia de fuentes?
public class FontList {
public static final String gothicbNormal="fonts/gothicb.ttf";
public static final String gothicbBold="fonts/gothicb.ttf";
}
hizo FontList después de que acaba de llamar a métodos en cualquier lugar con el paso dos parámetros.
En lugar de la carpeta de activos, puede colocar el archivo .ttf en la carpeta de fuentes. Para usar el soporte de fuentes en la función XML en dispositivos con Android 4.1 (nivel API 16) y superior, use la Biblioteca de soporte 26+. Haga clic con el botón derecho en la carpeta res, nuevo -> directorio de recursos de Android -> seleccione la fuente -> Aceptar. ponga su archivo "myfont.ttf" en la carpeta de fuentes recién creada.
En res / values / styles.xml agregar,
<style name="customfontstyle" parent="@android:style/TextAppearance.Small">
<item name="android:fontFamily">@font/myfont</item>
</style>
En el archivo de diseño, agregue android: textAppearance = "@ style / customfontstyle",
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/customfontstyle"/>
Consulte: https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml
En mi investigación, no hay manera de agregar una fuente externa al archivo xml. Sólo la fuente predeterminada 3 está disponible en xml
Pero puedes usar en java usando este código.
Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/verdana.ttf");
textfield.setTypeface(tf,Typeface.BOLD);
Actualizar:
Ahora encuentro una forma de hacerlo creando una clase personalizada que amplía TextView y la uso en el archivo 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 olvides agregar el esquema en la raíz de tu xml.
xmlns:font="http://schemas.android.com/apk/res-auto"
Y cree 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 encontró algún problema de rendimiento cuando esta vista personalizada se usa en la vista de lista, es decir, porque la fuente Objeto está creando cada vez que se carga la vista. La solución que encontré es inicializar la fuente en la Clase de Aplicación y referir ese objeto de 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;
}
}
Espero aprovecharlo a pleno: -
TextView text = (TextView) findViewById(R.id.custom_font);
Typeface font = Typeface.createFromAsset(getAssets(), "yourfont.ttf");
text.setTypeface(font);
Puede acceder a su archivo de fuente desde la carpeta de activos al archivo xml.
android: fontFamily = "fonts / roboto_regular.ttf"
fuentes es la subcarpeta en la carpeta de activos.
Puede utilizar esta biblioteca: Calligraphy
Solo tiene que agregar la fuente que desea usar en su diseño. Me gusta esto:
<TextView
fontPath="fonts/verdana.ttf"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Soorya tiene razón, pero si tiene que colocar la misma fuente en muchas vistas de texto, le recomiendo que coloque ese código dentro de un método estático que devuelva el Tipo de letra que desea. Reducirá las líneas en su código. O incluso mejor, cree una clase que amplíe la aplicación y cree un método GET que devuelva el tipo de letra. Ese método será accesible desde cualquier actividad dentro de su aplicación (sin la necesidad de usar variables estáticas o métodos estáticos).
Tomé la respuesta de droid kid y la hice funcionar con CUALQUIER fuente, simplemente escribiendo el nombre de la 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>
Fuentes.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, e.g. "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);
}
}
}
Utiliza esta función si está utilizando 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();
}
}
fount change es una funcionalidad muy básica en Android que se necesita principalmente para todas y cada una de las aplicaciones. Por lo tanto, cada una desea cambiar solo una vez en la aplicación que reduce nuestro tiempo de desarrollo, por lo que le sugiero ver este enlace FountChanger.class .
Edición 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 Calligraphy . Es la forma más fácil para 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 solo la fuente a una parte del texto
Encontré otra forma de hacer esto.
Tienes que hacer tu propio TextView
usando este tutorial
No es tan difícil y después de esto solo puedes usar ese TextView
con tu propia fuente.
No sé si alguien todavía mira esto, pero pensé que podría ayudar.