Pregunta

Me aplica 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);

Puede alguien por favor sácame de este problema?

¿Fue útil?

Solución

En Mobiletuts + hay muy buen tutorial sobre el formateo de texto para Android. Consejo rápido: Personalizar Android Fuentes

EDIT: Probado por mí mismo ahora. Aquí está la solución. Se puede utilizar una subcarpeta denominada Tipos pero no debe ir en la carpeta de la carpeta assets res. Así

  

activos / tipos de letra

También asegúrese de que el tipo de letra que termina me refiero a la finalización del archivo de fuente 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

Otros consejos

Después de tratar la mayoría de las soluciones descritas en este hilo, encontré accidentalmente de la caligrafía ( https://github.com/chrisjenx/Calligraphy) - una biblioteca de Christopher Jenkins que le permite añadir fácilmente fuentes personalizadas para su aplicación. Las ventajas de su lib comparación con los enfoques sugiere aquí son:

  1. que no tiene que introducir su propio componente Vista de Texto overriden, utiliza el
  2. incorporado en TextView
  3. que fácilmente puede incluir el uso de la biblioteca Gradle
  4. La biblioteca no limita su opción de fuentes; que acaba de añadir a sus preferidos a los activos dir
  5. que no sólo obtener vistas de texto personalizados -. Todos los demás compontents Android basados ??en texto también se mostrará el uso de su fuente personalizada

Sé que hay buenas respuestas ya, pero aquí es una aplicación completamente de trabajo.

Aquí está 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);
            }
        }
    }
}

A continuación los atributos personalizados. Esto debe 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í es cómo lo usa. Voy a usar una disposición relativa a envolverlo y mostrar la declaración customAttr, pero es evidente que podría ser cualquier cosa diseño que ya tiene.

<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 este antes. La única diferencia entre nuestras implementaciones es que no estaba usando una subcarpeta en activos. No estoy seguro si eso va a cambiar nada, sin embargo.

Siempre que ha colocado la fuente en el lugar correcto y no hay ningún error en el archivo de fuente en sí, el código debe trabajar así, serpiente de cascabel.

Sin embargo, sería mucho más fácil si pudiera definir una fuente en su diseño xml, 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 la res/values/styles.xml acompaña:

<?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. Consulte el este proyecto de GitHub, o echar un vistazo a este Registrarse puesto que explica todo el asunto

Para Fuentes personalizado en androide crear una carpeta dentro de los activos carpeta el nombre de "fuentes" coloque su fonts.ttf deseada o archivo .otf en ella.

Si se extiende UIBaseFragment:

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

más si se extiende Actividad:

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

La mejor manera de hacerlo desde Android O versión preliminar es de esta manera:
  sólo funciona si tiene androide estudio-2.4 o superior

  1. Haga clic en el res carpeta y vaya a Nuevo> Directorio de recursos Android . La Nueva
    Aparecerá la ventana de directorio de recursos.
  2. En la lista Tipo de recurso, seleccione fuente y, a continuación, haga clic en Aceptar.
  3. Añadir sus ficheros en la fuente carpeta .La estructura de carpetas a continuación genera R.font.dancing_script, R.font.la_la y R.font.ba_ba.
  4. doble clic en un archivo de fuentes para previsualizar las fuentes del archivo en el editor.

A continuación se debe crear una familia de fuentes:

  1. Haga clic derecho en la carpeta de fuentes y vaya a archivo de recursos Nueva> Fuente . Aparece la ventana de nuevo archivo de recursos.
  2. Introduzca el Nombre de archivo y, a continuación, haga clic en Aceptar . El nuevo recurso de la fuente XML se abre en el editor.
  3. Incluya cada archivo fuente, el estilo, y el atributo de peso en el elemento de etiqueta de fuente. El siguiente código XML ilustra la adición de atributos relacionados con las fuentes en el recurso de la fuente XML:

             

Añadir 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 las fuentes

Todas las medidas son correctas.

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" />

Como yo no estaba satisfecho con todas las soluciones presentadas en SO, se me ha ocurrido con la mía. Se basa en un pequeño truco con las etiquetas (es decir, no puede utilizar las etiquetas en su código), puse la ruta de fuentes allí. Así que cuando la definición de vistas, se puede hacer ya sea 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 usted puede o explícitamente el acceso / configuración de la vista como:

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

o simplemente conectar 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 lo que es la clase de magia que usted pide? Mayormente pegado de otra mensajes lo tanto, con métodos de ayuda tanto 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;
    }
}

Desafortunadamente no hay una buena solución para esto.

he visto los muchos artículos sobre el uso de un TextView costumbre, pero lo que olvidan es que es no sólo textviews que se implementan las fuentes y hay textviews escondidos en otros puntos de vista inaccesible para el desarrollador; Ni siquiera voy a empezar a trabajar en Spannable .

Se podría utilizar un utilidad de la fuente externa, como:

de herramientas de fuente de la caligrafía

y Este bucles más de todas las vistas de la aplicación en su creación y hasta esta utilidad pierde algunos puntos de vista (ViewPager hace letra normal), entonces usted tiene el problema de que es cuando Google actualiza sus herramientas de construcción Esto le de vez en cuando chocar porque tiene que apuntar propiedades en desuso. También es un poco lento, ya que utiliza La reflexión de Java .

Es realmente depende de Google para solucionar este problema. Necesitamos el apoyo de una mejor fuente en Android. Si nos fijamos en la solución de IOS que, literalmente, tienen 100 de las fuentes incorporadas a elegir. ¿Quieres una fuente personalizada? Simplemente coloque un TFF y que es utilizable ..

Por ahora se limita ahora a la oferta que Google nos ofrece, que es extremadamente limitado, pero afortunadamente móvil optimizado.

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

Android 8.0 utilizar fuentes de encargo en la Solicitud hizo fácil con downloadable fonts. Podemos añadir fuentes directamente a la res/font/ folder en la carpeta del proyecto, y al hacerlo, se convierten en las fuentes disponibles automáticamente en Android Studio.

res carpeta bajo con la fuente y el nombre del tipo de conjunto de tipo de letra

Ahora ajustar fontFamily atributo a la lista de fuentes o haga clic en Más y seleccione la fuente de su elección. Esta Añadir línea tools:fontFamily="@font/your_font_file" a su TextView.

Esto generará automáticamente algunos archivos.

1. En los valores de carpeta que creará fonts_certs.xml.

2 en el manifiesto que se sumará estas líneas:.

  <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts" /> 

3. preloaded_fonts.xml

<resources>
    <array name="preloaded_fonts" translatable="false">
        <item>@font/open_sans_regular</item>
        <item>@font/open_sans_semibold</item>
    </array>
</resources>

Yo tenía el mismo problema, el TTF no se presentó. He cambiado el archivo de fuentes, y con el mismo código que está funcionando.

Si desea cargar la fuente de la red o un estilo 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);

Bueno, después de siete años que puede cambiar toda textView aplicación o lo que quiere fácilmente mediante el uso de bibliotecas android.support 26 ++.

por ejemplo:

Crea tu paquete de fuentes app / src / res / font y mover su fuente en ella.

introducir descripción de la imagen aquí

Y en el tema de aplicación sólo tiene que añadir como un fontFamily:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
   . . . ...
    <item name="android:fontFamily">@font/demo</item>
</style>

Ejemplo para el uso con textView solamente:

<style name="fontTextView" parent="@android:style/Widget.TextView">
    <item name="android:fontFamily">monospace</item>
</style>

Y agregar a su tema principal:

<item name="android:textViewStyle">@style/fontTextView</item>

En la actualidad se ha trabajado en 8.1 hasta 4.1 Jelly Bean API Y eso es una amplia gama.

Actualización de respuesta: Android 8.0 (API nivel 26) presenta una nueva característica, Fuentes en XML. sólo tiene que utilizar las fuentes en función de XML en dispositivos con Android 4.1 (API nivel 16) y superior, utilice el soporte de bibliotecas 26.

enlace


vieja respuesta

Hay dos maneras de personalizar las fuentes:

  

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


Camino 1: Refrection Typeface.class ||| mejor manera

llamada FontsOverride.setDefaultFont () en la clase de aplicación se extiende, Este código hará que todas las fuentes de software que va a cambiar, incluso tostadas fuentes

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();
        }
    }
}


Vía 2: uso setTypeface

En vista especial sólo setTypeface llamada () 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<String, Typeface> 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 utilizar EasyFonts biblioteca de terceros fácil y sencillo de instalar variedad de costumbre fuentes a su TextView. Mediante el uso de esta biblioteca que no debería tener que preocuparse acerca de la descarga y la adición de fuentes en los activos / carpeta de fuentes. También se trata de 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 siguiente cara de la fuente.

  • Roboto
  • Droid Serif
  • Droid Robot
  • La libertad
  • Fun Raiser
  • Nación Android
  • verde aguacate
  • Reconocimiento

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

https: // desarrollador .android.com / guía / temas / ui / look-and-feel / fonts-en-xml.html

Esta consiste en colocar los archivos TTF en res / carpeta de fuentes y la creación de un archivo de fuente familiar.

La solución más sencilla Android compatibles ahora!

Usar fuente personalizada en XML:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/[your font resource]"/>

detalles aspecto:

https: // desarrollador .android.com / guía / temas / ui / look-and-feel / fonts-en-xml.html

  • Abra su proyecto y seleccione Proyecto en la parte superior izquierda
  • aplicación -> src -> principal
  • Haga clic derecho a la principal y crear nombre de directorio como activos
  • Haga clic derecho de assest y crear nuevo nombre del directorio que Fuentes
  • es necesario encontrar fuentes gratuitas como libre de fuentes
  • darle a su Textview y lo llaman en su clase de actividad
  • copiar sus fuentes dentro de la Fuentes carpeta
  • TextView txt = (TextView) findViewById(R.id.txt_act_spalsh_welcome); Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Aramis Italic.ttf"); txt.setTypeface(font);

nombre de la fuente debe ser correcta y divertirse

Sí, fuentes descargables son tan fáciles, como Dipali s dijo.

Esta es la forma de hacerlo ...

  1. Coloque un TextView.
  2. En el panel Propiedades, seleccione el menú desplegable fontFamily. Si no está ahí, encontrar la manivela de intercalación (la> y haga clic en él para ampliar textAppearance) bajo el.
  3. Ampliar la gota abajo font-family.
  4. En la pequeña lista, recorra todo el camino hacia abajo hasta que vea more fonts
  5. Esto abrirá un cuadro de diálogo donde se puede buscar desde Google Fonts
  6. Búsqueda de la fuente que al igual que con la barra de búsqueda en la parte superior
  7. Seleccione su fuente.
  8. Seleccione el estilo de la fuente te gusta (es decir, negrita, normal, cursiva, etc)
  9. En el panel derecho, seleccione el botón de opción que dice Add font to project
  10. Haga clic bien. Ahora su TextView tiene la fuente que te gusta!

PRIMA: Si desea TODO estilo con el texto en su aplicación con la fuente elegida, sólo tiene que añadir <item name="android:fontfamily">@font/fontnamehere</item> en su styles.xml

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top