web-dev-qa-db-fra.com

Définition de la police Roboto dans TextView - xml

J'ai trouvé plusieurs articles sur ce sujet, mais tous ces sujets définissent la police avec la méthode setTypeFace() sur un objet TextView ou créent une classe personnalisée qui définit la police sur Roboto et extendsTextView. Autant que je sache, de niveau API 11 (?) Ou quelque chose du genre, nous sommes en mesure de définir le TypeFace en tant qu'attribut xml. Comme ça:

   <TextView
      Android:id="@+id/profileHeader"
      Android:layout_width="100dp"
      Android:layout_height="100dp"
      Android:typeface="roboto"
      Android:text="Hello, world">
   </TextView>

Quel est le bon moyen de le faire? Est-il possible d'avoir un repli si l'application s'exécute sur un périphérique inférieur au niveau 11 de l'API (?), Par exemple:

 Android:typeface="roboto|monospace|serif"
17

Jetez un coup d'oeil au RobotoTextView project. Fonctionne jusqu'à Android 1.5 et vous pouvez définir la police de caractères à l'aide d'attributs XML. Il comprend également d'autres vues telles que RobotoButton, RobotoCheckbox, etc.

6
cnnr

À partir de JellyBean (4.1), vous pouvez utiliser la méthode fournie dans cette rubrique StackOverflow . Si vous devez opter pour un monospace ou un empattement, déclarez un dossier layout-v16 contenant la police que vous avez choisie, c'est-à-dire "sans-serif-condensed", et Dans le dossier par défaut, vous utilisez la police "monospace" ou "serif". Si vous souhaitez utiliser une police autre que celle par défaut, vous pouvez vérifier par programme la version d'Android et choisir l'action appropriée, c'est-à-dire:

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
    TextView textView = (TextView) findViewById(R.id.textView_id);
    Typeface myFont = Typeface.createFromAsset(getAssets(),"RobotoCondensed.ttf");
    textView.setTypeface(myFont);
}
1
Vítor de Almeida

Ceci est pour les futurs gens qui courent dans le même problème que moi. La définition des caractères a tendance à occuper beaucoup de mémoire lors du chargement de plusieurs lignes. En utilisant les deux codes suivants ensemble pour le faire fonctionner correctement. J'ai eu la solution de stackoverflow mais leurs réponses n'étaient pas listées ensemble.

public class RobotoTextView extends TextView {

Context context;

public RobotoTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.context = context;
}

public RobotoTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
}

public RobotoTextView(Context context) {
    super(context);
    this.context = context;
}

public void setTypeface(Typeface tf, int style) {
    if (!isInEditMode()) {
        if (style == Typeface.NORMAL) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-Light.ttf"));
        } else if (style == Typeface.ITALIC) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-LightItalic.ttf"));
        } else if (style == Typeface.BOLD) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-Bold.ttf"));
        } else if (style == Typeface.BOLD_ITALIC) {
            super.setTypeface(TypeFaceProvider.getTypeFace(getContext(), "fonts/Roboto-BoldItalic.ttf"));
        }

    }
}



public class TypeFaceProvider {

private static Hashtable<String, Typeface> sTypeFaces = new Hashtable<String, Typeface>(
        4);

public static Typeface getTypeFace(Context context, String fileName) {
    Typeface tempTypeface = sTypeFaces.get(fileName);

    if (tempTypeface == null) {
        tempTypeface = Typeface.createFromAsset(context.getAssets(),
                fileName);
        sTypeFaces.put(fileName, tempTypeface);
    }

    return tempTypeface;
}
}
1
hafridi

Vous ne pouvez pas définir de police directement à partir d’actifs, car vous devez procéder comme suit dans onCreate. Cela fera la même chose que ce que vous voulez faire.

TextView tvTextView = (TextView) findViewById(R.id.textView1);
Typeface typeface = Typeface.createFromAsset(getAssets(),"Roboto.ttf");
tvTextView.setTypeface(typeface);

J'espère que cela vous aidera.: D

1
sachin

L'attribut Android:typeface n'a que quelques options valides (selon la documentation Android) ... 

  • ordinaire
  • sans
  • serif
  • monospace

Si vous avez besoin de la police Roboto dans votre application pour les appareils plus anciens, vous devez inclure les fichiers Roboto TTF dans votre projet. 

La manière la plus évidente d'utiliser ces polices consiste à utiliser la méthode setTypeface() de TextView, mais si vous souhaitez la spécifier au format XML, vous devez créer un TextView personnalisé et créer votre propre attribut styleable pour votre TextView personnalisé. 

Ce sujet est partout sur Internet .

1
Alex Fu

Je ne vois pas comment vous pouvez définir une police de caractères externe en tant qu'attribut xml. Vous devez stocker la police dans les ressources et appeler:

tv.setTypeface( Typeface.createFromAsset( context.getAssets(), roboto.ttf ) );
1
Vikram Gupta