Domanda

Ho applicato un tipo di carattere personalizzato a un TextView, ma non sembra cambiare il tipo di carattere.

Ecco il mio codice:

    Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
    TextView myTextView = (TextView)findViewById(R.id.myTextView);
    myTextView.setTypeface(myTypeface);

Qualcuno può farmi uscire da questo problema?

È stato utile?

Soluzione

In Mobiletuts + è molto buono tutorial su Text formattazione per Android. Tip: Personalizza Android Caratteri

EDIT: provato io stesso ora. Ecco la soluzione. È possibile utilizzare una sottocartella denominata caratteri ma deve andare nella cartella di non assets la cartella res. Quindi

  

assets / fonts

Assicurarsi inoltre che il tipo di carattere che termina intendo la fine del file di font in se è tutto in minuscolo. In altre parole, non dovrebbe essere myFont.TTF ma myfont.ttf in questo modo deve essere in minuscolo

Altri suggerimenti

Dopo aver provato la maggior parte delle soluzioni descritte in questa discussione, ho accidentalmente trovato Calligrafia ( https://github.com/chrisjenx/Calligraphy) - una libreria di Christopher Jenkins che consente di aggiungere facilmente font personalizzati per la vostra applicazione. I vantaggi del suo lib confronto con approcci suggerito qui sono:

  1. non c'è bisogno di introdurre un componente personalizzato sovresposta TextView, si utilizza il built-in TextView
  2. si può facilmente includere la libreria utilizzando Gradle
  3. La biblioteca non limita la vostra scelta di tipi di carattere; basta aggiungere i tuoi preferiti alle attività dir
  4. non si ottiene solo viste di testo personalizzati -. Tutti gli altri basati su testo compontents Android verranno visualizzati anche con il vostro carattere personalizzato

So che ci sono buone risposte già, ma ecco un'implementazione completamente funzionante.

Ecco la vista testo personalizzato:

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

Ecco gli attributi personalizzati. Questo dovrebbe andare al file res/attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomFontTextView">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

Ed ecco come lo si utilizza. Userò un layout rispetto ad avvolgerla e mostrare la dichiarazione customAttr, ma potrebbe ovviamente essere qualunque layout che già avete.

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

Ho usato con successo questo prima. L'unica differenza tra le nostre implementazioni è che non stavo usando una sottocartella in attività. Non sono sicuro se questo cambierà nulla, però.

A condizione che è stato inserito il tipo di carattere nel posto giusto e non c'è nessun errore nel file dei font in sé, il codice dovrebbe funzionare così, serpente a sonagli.

Tuttavia, sarebbe molto più facile se si può solo definire un tipo di carattere nel layout xml, in questo modo:

<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 accompagna:

<?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>

Ho creato un paio di strumenti appositamente per questo scopo. Fare riferimento a questo progetto da GitHub, o dare un'occhiata a questo blog messaggio che spiega il tutto

Per personalizzato font in Android creare una cartella all'interno della cartella patrimonio nome "font" posizionare il fonts.ttf desiderata o il file .otf in esso.

Se si estende UIBaseFragment:

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

altro, se si estende attività:

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

Il modo migliore per farlo da anteprima di rilascio di Android O è in questo modo:
  Funziona solo se si dispone di Android studio-2.4 o superiore

  1. Fare clic con il res cartella e seleziona Nuovo> directory delle risorse Android . The New
    Viene visualizzata la finestra di directory delle risorse.
  2. Nell'elenco Tipo di risorsa, selezionare tipo di carattere , e quindi fare clic su OK.
  3. Aggiungi i file dei font nella cartella di carattere .La struttura delle cartelle di seguito genera R.font.dancing_script, R.font.la_la e R.font.ba_ba.
  4. Fare doppio clic su di un file di font per visualizzare in anteprima i font del file nell'editor.

Poi si deve creare una famiglia di caratteri:

  1. Fare clic sulla cartella dei font e andare a Nuovo file di risorse> Carattere . Verrà visualizzata la finestra File New Resource.
  2. Inserisci il Nome file, quindi scegliere OK . Il nuovo XML risorsa di carattere apre l'editor.
  3. Racchiudere ogni file di carattere, lo stile e l'attributo peso nell'elemento tag font. Il seguente codice XML illustra l'aggiunta di attributi relative ai font in XML risorsa font:

             

L'aggiunta di font per un TextView:

   <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/hey_fontfamily"/>

Come da documentazione

  

Utilizzo dei font

Tutti i passaggi sono corretti.

È possibile utilizzare PixlUI a https://github.com/neopixl/PixlUI

importare la loro .jar e utilizzarlo in 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" />

Dal momento che non è stata soddisfatta con tutte le soluzioni presentate su così, mi è venuta in mente la mia. Si basa su un piccolo trucco con i tag (vale a dire non è possibile utilizzare i tag nel codice), ho messo il percorso del font lì. Così, al momento di definire punti di vista, si può fare o questo:

<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 questo:

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

E 'quindi possibile esplicitamente l'accesso / setup la vista come:

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

o solo l'installazione tutto via:

TextViewHelper.setupTextViews(this, (ViewGroup) findViewById(R.id.parentLayout)); // parentLayout is the root view group (relative layout in my case)

E qual è la classe magia si chiede? Per lo più incollata da un altro messaggi così, con metodi di supporto sia per l'attività e frammenti:

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

Purtroppo non esiste una soluzione buona per questo.

Ho visto i numerosi articoli su utilizzando un TextView personalizzato ma quello che dimenticare che non è solo textviews che possono implementare i font e ci sono textviews nascosti in altre viste inaccessibile al sviluppatore; Non ho nemmeno intenzione di iniziare a Spannable .

Si potrebbe utilizzare un programma di utilità di carattere esterno come:

Calligrafia Font strumento

MA Questo loop oltre ogni vista nell'applicazione su di essa la creazione e anche questa utility manca alcuni punti di vista (ViewPager rende font normale) allora si ha il problema che è quando Google aggiorna i propri strumenti di compilazione Ciò di tanto in tanto in crash perché ha bisogno di indirizzare le proprietà deprecato. E 'anche un po' lento in quanto utilizza Riflessione di Java .

E 'davvero a Google per risolvere questo problema. Abbiamo bisogno di un migliore supporto dei caratteri in Android. Se si guarda alla soluzione da iOS hanno letteralmente hanno 100 di font incorporati in cui scegliere. Vuoi un carattere personalizzato? Semplicemente cadere un TFF in ed è utilizzabile ..

Per il momento sono stati ora limitata alla offerta che Google ci offre, che è estremamente limitata, ma per fortuna ottimizzato per i cellulari.

Assicurati di incollare il codice sopra in onCreate () dopo la chiamata al super e la chiamata a setContentView (). Questo piccolo dettaglio mantenuto il mio up appeso per un po '.

Android 8.0 utilizzando personalizzato font nell'applicazione diventato facile con downloadable fonts. Possiamo aggiungere i font direttamente al res/font/ folder nella cartella di progetto, e in tal modo, i font diventano automaticamente disponibili in Android Studio.

res cartella sotto con nome del font e impostare il tipo di carattere

Ora impostare fontFamily attributo elenco dei caratteri o fare clic su più e selezionare carattere della vostra scelta. Questo sarà Aggiungi linea tools:fontFamily="@font/your_font_file" al vostro TextView.

Questo genererà automaticamente alcuni file.

1. In valori cartella si creerà fonts_certs.xml.

2 Nel manifesto si aggiungerà queste righe:.

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

Ho avuto lo stesso problema, la TTF non si fece vedere. Ho cambiato il file di font, e con lo stesso codice che sta funzionando.

Se si desidera caricare il tipo di carattere dalla rete o facilmente lo stile, è possibile utilizzare:

https://github.com/shellum/fontView

Esempio:

<!--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);

Bene, dopo sette anni è possibile cambiare tutta la textView app o quello che vuoi facilmente utilizzando le librerie android.support 26 ++.

per esempio:

Crea il tuo pacchetto di font app / src / res / font e spostare il carattere in esso.

entrare descrizione dell'immagine qui

E nella vostra app tema basta inserirlo come fontFamily:

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

Esempio per l'uso con textView solo:

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

E aggiungere nella vostra tema principale:

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

Al momento ha funzionato su 8.1 fino a 4.1 Jelly Bean API E questa è una vasta gamma.

Aggiornamento risposta: Android 8.0 (API di livello 26) introduce una nuova funzione, tipi di carattere in XML. basta utilizzare i font in funzione XML su dispositivi con Android 4.1 (livello di API 16) e superiore, utilizzare la libreria di supporto 26.

link


Old risposta

Ci sono due modi per personalizzare i font:

  

!!! il mio carattere personalizzato in   assets / fonts / iran_sans.ttf


Way 1: Refrection Typeface.class ||| miglior modo

chiamata FontsOverride.setDefaultFont () nella classe estende Application, Questo codice farà sì che tutti i caratteri del software di essere cambiato, anche toast font

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


Way 2: l'uso setTypeface

per la visualizzazione speciale solo setTypeface call () per cambiare font.

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

}

È possibile utilizzare facile e semplice EasyFonts libreria di terze parti al set di varietà di costume font al vostro TextView. Utilizzando questa libreria non si dovrebbe avere a preoccuparsi di scaricare e aggiungere i font nel patrimonio / cartella dei font. Inoltre circa la creazione di oggetti di carattere.

Al posto di

Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(myTypeface);

Semplicemente:

TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(EasyFonts.robotoThin(this));

Questa libreria fornisce anche a seguito di font.

  • Roboto
  • Droid Serif
  • Droid Robot
  • Libertà
  • Divertimento Raiser
  • Android Nazione
  • Green avocado
  • Riconoscimento

Il modo corretto di fare questo come di API 26 è descritto nella documentazione ufficiale qui:

https: // sviluppatore .android.com / guida / argomenti / ui / look-and-feel / font-in-xml.html

Questa consiste nel posizionare i file TTF in res / cartella dei font e la creazione di un file font-family.

La soluzione più semplice Android supportato ora!

Usa carattere personalizzato in xml:

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

particolari che:

https: // sviluppatore .android.com / guida / argomenti / ui / look-and-feel / font-in-xml.html

  • Aprire il progetto e selezionare Progetto in alto a sinistra
  • app -> src -> principale
  • tasto destro del mouse per creare principale e il nome della directory come attivi
  • tasto destro del mouse per assest e creare nuovo nome di directory è font
  • è necessario trovare i font gratuiti come libero font
  • dare al tuo TextView e lo chiamano nella tua classe di attività
  • copiare i font all'interno del font la cartella
  • TextView txt = (TextView) findViewById(R.id.txt_act_spalsh_welcome); Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Aramis Italic.ttf"); txt.setTypeface(font);

nome del carattere deve essere corretta e divertirsi

Sì, font scaricabili sono così facili, come Dipali s ha detto.

Questo è come si fa ...

  1. Inserisci un TextView.
  2. Nel riquadro proprietà, selezionare il menu a discesa fontFamily. Se non è lì, trovare il thingy accento circonflesso (il> e fare clic su di esso per espandere textAppearance) sotto il.
  3. Espandi il basso font-family goccia.
  4. Nella piccola lista, scorrere fino in fondo fino a vedere more fonts
  5. Si aprirà una finestra di dialogo in cui è possibile ricercare Google Fonts
  6. Ricerca per il tipo di carattere che ti piace con la barra di ricerca in alto
  7. Seleziona il tipo di carattere.
  8. Selezionare lo stile del carattere che ti piace (cioè grassetto, normale, corsivo, ecc)
  9. Nel riquadro di destra, selezionare il pulsante di opzione che dice Add font to project
  10. Fare clic su ok. Ora il vostro TextView ha il carattere che ti piace!

BONUS: Se volete TUTTO stile con il testo nella vostra applicazione con font scelto, è sufficiente aggiungere <item name="android:fontfamily">@font/fontnamehere</item> nella vostra styles.xml

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top