174 votes

Des polices personnalisées et des schémas XML (Android)

Je suis en train de définir une interface graphique, mise en page à l'aide de fichiers XML dans Android. Aussi loin que je peux trouver, il n'y a aucun moyen de spécifier que vos widgets doit utiliser une police personnalisée (par exemple, celui que vous avez placés dans des actifs/police/) dans des fichiers XML et vous pouvez utiliser le système uniquement les polices installées.

Je sais que, dans le code Java, que je puisse changer la police de chaque widget manuellement à l'aide des Identifiants uniques. Sinon, je pourrais parcourir toutes les widgets en Java pour faire ce changement, mais ce serait probablement très lent.

Quelles autres options s'offrent à moi? Est-il de meilleures façons de faire les widgets qui ont un look custom? Je n'ai pas particulièrement envie d'avoir à modifier manuellement la police pour chaque nouveau widget-je ajouter.

220voto

peter Points 3083

Vous pouvez étendre TextView pour définir des polices personnalisées comme je l'ai appris ici.

TextViewPlus.java:

package com.example;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

public class TextViewPlus extends TextView {
    private static final String TAG = "TextView";

    public TextViewPlus(Context context) {
        super(context);
    }

    public TextViewPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface tf = null;
        try {
        tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
        } catch (Exception e) {
            Log.e(TAG, "Could not get typeface: "+e.getMessage());
            return false;
        }

        setTypeface(tf);  
        return true;
    }

}

attrs.xml: (dans res/valeurs)

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

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:foo="http://schemas.android.com/apk/res/com.example"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.example.TextViewPlus
        android:id="@+id/textViewPlus1"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="saxmono.ttf">
    </com.example.TextViewPlus>
</LinearLayout>

Vous mettriez "saxmono.ttf" dans les actifs dossier.

Mise à JOUR 8/1/13

Il y a de graves problèmes de mémoire avec cette méthode. Voir chedabob de commentaire ci-dessous.

35voto

Ragunath Jawahar Points 6124

J’ai 3 ans vers la fin de la partie  :( Cependant, cela pourrait être utile pour quelqu'un qui pourrait tomber par hasard sur ce post.

J’ai avez écrit une bibliothèque qui met en cache des polices de caractères et vous permettent également de spécifier des polices de caractères personnalisés directement à partir de XML. Vous pouvez trouver la bibliothèque ici.

Voici à quoi ressemblerait votre mise en page XML similaires, lorsque vous l’utilisez.

18voto

Leonardo Cardoso Points 535

C’est peut-être un peu tard, mais vous devez créer une classe singleton qui retourne la typographie personnalisée pour éviter les fuites de mémoire.

Classe de caractères :

TextView personnalisé :

Par xml :

Par programme :

13voto

thoutbeckers Points 201

Vieille question, mais je voudrais bien que j'ai lu cette réponse ici avant j'ai commencé ma propre recherche d'une bonne solution. La calligraphie s'étend de l' android:fontFamily de l'attribut à ajouter le support pour les polices personnalisées dans votre fichier actif, comme suit:

<TextView 
  android:text="@string/hello_world"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:fontFamily="fonts/Roboto-Bold.ttf"/>

La seule chose que vous avez à faire pour l'activer, il est attachant au Contexte de l'Activité que vous utilisez:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(new CalligraphyContextWrapper(newBase));
}

Vous pouvez également définir vos propres attributs personnalisés pour remplacer android:fontFamily

Il travaille également dans les thèmes, y compris la AppTheme.

7voto

Tore Rudberg Points 364

Si vous n’avez qu’une police de caractères que vous souhaitez ajouter et veulent moins de code à écrire, vous pouvez créer un TextView dédié pour votre police spécifique. Voir code ci-dessous.

Dans main.xml, vous pouvez maintenant ajouter votre textView comme ceci :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X