Android – Uso de fuentes personalizadas
He aplicado una fuente personalizada a un TextView
, pero no parece cambiar la tipografía.
Aquí está mi código:
- Configuración de la fuente de texto del botón en android
- Reduciendo el tamaño de fuente de los componentes de AlertDialog.Builder
- Cómo cambiar el tamaño de fuente en una aplicación completa mediante programación, Android?
- Usar fuente Roboto para dispositivos anteriores
- ¿Es posible el estilo de los estilos de fuentes de Android con líder y el seguimiento?
Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf"); TextView myTextView = (TextView)findViewById(R.id.myTextView); myTextView.setTypeface(myTypeface);
¿Puede alguien por favor sacarme de este problema?
- El cambio de fuente reinicia la actividad
- Cambiar la fuente del fragmento de lista en el fragmento de detalle
- Cómo agregar fuentes externas a la aplicación Android
- Cómo configurar la familia de fuentes predeterminada para toda la aplicación de Android
- El tamaño de fuente de TextView en la aplicación Android cambia al cambiar el tamaño de la fuente de la configuración nativa
- RuntimeException: tipo de letra nativo no se puede hacer o pérdida de memoria para personalizado TextView carga de fuente
- Uso de fuentes personalizadas para todo el texto de la aplicación que no funciona con Lollipop
- ¿Es posible establecer una fuente personalizada para toda la aplicación?
En Mobiletuts + hay muy buen tutorial sobre el formato de texto para Android. Sugerencia rápida: personalizar las fuentes de Android
EDIT: Probado yo mismo ahora. Aquí está la solución. Puede usar una subcarpeta llamada fuentes, pero debe ir en la carpeta de assets
no en la carpeta res
. Asi que
Activos / fuentes
También asegúrese de que el final de la fuente me refiero al final de la fuente del archivo en sí es todo en minúsculas. En otras palabras, no debe ser myFont.TTF
pero myfont.ttf
esta manera debe estar en minúsculas
Después de probar la mayoría de las soluciones descritas en este hilo, encontré accidentalmente Calligraphy ( https://github.com/chrisjenx/Calligraphy ) – una biblioteca de Christopher Jenkins que te permite agregar fácilmente fuentes personalizadas a tu aplicación. Las ventajas de su lib comparando con los enfoques sugeridos aquí son:
- No es necesario que introduzca su propio componente de TextView, que utiliza el TextView incorporado
- Puede incluir fácilmente la biblioteca usando gradle
- La biblioteca no limita su elección de fuentes; Simplemente añada sus preferidos al directorio de activos
- No solo obtendrá vistas de texto personalizadas, sino que también mostrará todos los demás componentes de Android basados en texto con su fuente personalizada.
Ya sé que ya hay buenas respuestas, pero aquí hay una implementación totalmente funcional.
Esta es la vista de texto personalizado:
package com.mycompany.myapp.widget; /** * Text view with a custom font. * <p/> * 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
:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CustomFontTextView"> <attr name="customFont" format="string"/> </declare-styleable> </resources>
Y aquí está cómo usted lo utiliza. customAttr
un diseño relativo para envolverlo y mostrar la declaración customAttr
, pero obviamente podría ser cualquier diseño que ya tenga.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:customAttrs="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <com.mycompany.myapp.widget.CustomFontTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="foobar" customAttrs:customFont="roboto_thin" /> </RelativeLayout>
He utilizado con éxito esto antes. La única diferencia entre nuestras implementaciones es que no estaba usando una subcarpeta en los activos. No estoy seguro si eso cambiará cualquier cosa, aunque.
Siempre que haya colocado la fuente en el lugar correcto y no haya ningún error en el archivo de fuente en sí, su código debería funcionar así, RATTLESNAKE.
Sin embargo, sería mucho más fácil si sólo podría definir una fuente en su xml de diseño, como esto:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <!-- This text view is styled with the app theme --> <com.innovattic.font.FontTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This uses my font in bold italic style" /> <!-- This text view is styled here and overrides the app theme --> <com.innovattic.font.FontTextView android:layout_width="wrap_content" android:layout_height="wrap_content" app:flFont="anotherFont" android:textStyle="normal" android:text="This uses another font in normal style" /> <!-- This text view is styled with a style and overrides the app theme --> <com.innovattic.font.FontTextView style="@style/StylishFont" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This also uses another font in normal style" /> </LinearLayout>
Con los res/values/styles.xml
:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <!-- Application theme --> <!-- Use a different parent if you don't want Holo Light --> <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <item name="android:textViewStyle">@style/MyTextViewStyle</item> </style> <!-- Style to use for ALL text views (including FontTextView) --> <!-- Use a different parent if you don't want Holo Light --> <style name="MyTextViewStyle" parent="@android:style/Widget.Holo.Light.TextView"> <item name="android:textAppearance">@style/MyTextAppearance</item> </style> <!-- Text appearance to use for ALL text views (including FontTextView) --> <!-- Use a different parent if you don't want Holo Light --> <style name="MyTextAppearance" parent="@android:style/TextAppearance.Holo"> <!-- Alternatively, reference this font with the name "aspergit" --> <!-- Note that only our own TextView's will use the font attribute --> <item name="flFont">someFont</item> <item name="android:textStyle">bold|italic</item> </style> <!-- Alternative style, maybe for some other widget --> <style name="StylishFont"> <item name="flFont">anotherFont</item> <item name="android:textStyle">normal</item> </style> </resources>
He creado un par de herramientas específicamente para este propósito. Refiérase a este proyecto desde GitHub, o eche un vistazo a esta entrada del blog que explica todo el asunto.
Para las fuentes personalizadas en android, cree una carpeta dentro del nombre de la carpeta de activos. "Fuentes" sitúe el archivo fonts.ttf o .otf deseado en él.
Si extiende UIBaseFragment:
Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Arial.ttf"); tv.setTypeface(font);
Else if extends Actividad:
Typeface font = Typeface.createFromAsset(getContext().getAssets(), "fonts/Arial.ttf"); tv.setTypeface(font);
La mejor manera de hacerlo Desde Android O preview release es así:
Funciona solo si tienes android studio-2.4 o superior
- Haga clic con el botón derecho en la carpeta Res y vaya a Nuevo> Directorio de recursos de Android . El nuevo
Aparece la ventana Directorio de recursos. - En la lista Tipo de recurso, seleccione la fuente y, a continuación, haga clic en Aceptar.
- Agregue los archivos de fuente en la carpeta de fuentes . La estructura de carpetas que se encuentra a continuación genera
R.font.dancing_script
,R.font.la_la
yR.font.ba_ba
. - Haga doble clic en un archivo de fuentes para obtener una vista previa de las fuentes del archivo en el editor.
A continuación debemos crear una familia de fuentes:
- Haga clic con el botón derecho en la carpeta de fuentes y vaya a Nuevo> Archivo de recursos de fuentes . Aparecerá la ventana Nuevo archivo de recursos.
- Escriba el nombre de archivo y, a continuación, haga clic en Aceptar . El nuevo recurso de fuente XML se abre en el editor.
-
Incluya cada atributo de archivo de fuente, estilo y peso en el elemento de etiqueta de fuente. El siguiente XML ilustra la adición de atributos relacionados con fuentes en el recurso de fuente XML:
Adición de fuentes a un TextView:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/hey_fontfamily"/>
A partir de la documentación
Trabajar con fuentes
Todos los pasos son correctos.
Puede utilizar PixlUI en https://github.com/neopixl/PixlUI
Importar su .jar y usarlo en XML
<com.neopixl.pixlui.components.textview.TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" pixlui:typeface="GearedSlab.ttf" />
Ya que no estaba satisfecho con todas las soluciones presentadas en SO, he llegado con la mía. Se basa en un pequeño truco con las etiquetas (es decir, no puede utilizar etiquetas en su código), pongo la ruta de la fuente allí. Por lo tanto, al definir las vistas, puede hacer esto:
<TextView android:id="@+id/textViewHello1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World 1" android:tag="fonts/Oswald-Regular.ttf"/>
o esto:
<TextView android:id="@+id/textViewHello2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World 2" style="@style/OswaldTextAppearance"/> <style name="OswaldTextAppearance"> <item name="android:tag">fonts/Oswald-Regular.ttf</item> <item name="android:textColor">#000000</item> </style>
Ahora puede acceder o configurar explícitamente la vista como:
TextView textView = TextViewHelper.setupTextView(this, R.id.textViewHello1).setText("blah");
O simplemente configurar 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 pides? En su mayoría pegado desde otros puestos de SO, con métodos auxiliares para la actividad y 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<String, Typeface> 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; } }
Asegúrese de pegar el código anterior en onCreate () después de su llamada a la súper y la llamada a setContentView (). Este pequeño detalle mantuvo mi colgado por un rato.
Tuve el mismo problema, el TTF no apareció. He cambiado el archivo de fuente, y con el mismo código está funcionando.
Si desea cargar la fuente de la red o diseñarla fácilmente, puede utilizar:
https://github.com/shellum/fontView
Ejemplo:
<!--Layout--> <com.finalhack.fontview.FontView android:id="@+id/someFontIcon" android:layout_width="80dp" android:layout_height="80dp" /> //Java: fontView.setupFont("http://blah.com/myfont.ttf", true, character, FontView.ImageType.CIRCLE); fontView.addForegroundColor(Color.RED); fontView.addBackgroundColor(Color.WHITE);
Puede utilizar la sencilla y sencilla biblioteca de terceros de EasyFonts para establecer una variedad de fuentes personalizadas en su TextView
. Al utilizar esta biblioteca, no debería preocuparse por descargar y agregar fuentes a la carpeta assets / fonts. También sobre la creación de objetos Typeface.
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
- Diversión Raiser
- Android Nation
- Aguacate Verde
- Reconocimiento
Soy autor de esta biblioteca.
Desafortunadamente no hay una buena solución para esto.
He visto los muchos artículos sobre el uso de un TextView personalizado, pero lo que se olvidan de que no es sólo textviews que pueden implementar fuentes y hay visiones ocultas en otras vistas inaccesibles para el desarrollador; Ni siquiera voy a empezar a trabajar en Spannable .
Puede utilizar una utilidad de fuente externa como:
Herramienta de fuentes de caligrafía
PERO Este loops sobre cada vista en la aplicación en su creación e incluso esta utilidad pierde algunas vistas (ViewPager renderiza la fuente normal), entonces usted tiene el problema que es cuando Google actualiza sus herramientas de construcción esto ocasionalmente se bloquea, ya que necesita para orientar las propiedades obsoletas. También es un poco lento, ya que utiliza la reflexión de Java .
Es realmente hasta Google para arreglar esto. Necesitamos una mejor compatibilidad de fuentes en Android. Si nos fijamos en la solución de iOS que literalmente tienen 100 de las fuentes construidas para seleccionar. ¿Quieres una fuente personalizada? Simplemente deje caer un TFF y es utilizable ..
Por ahora se limitaron a la oferta que nos ofrece Google, que es muy limitado, pero afortunadamente móvil optimizado.
- ¿Cómo obtener el certificado de huella digital SHA-1 en Android Studio para el modo de depuración?
- Google-services.json para diferentes productFlavors