web-dev-qa-db-fra.com

Ajout de polices personnalisées au thème dans Android

Est-il possible d'ajouter des polices personnalisées dans Thèmes sous Android? 

J'ai lu Astuce: personnaliser les polices Android , mais ici, nous devons ajouter par programme une police personnalisée au texte.

TextView txt = (TextView) findViewById(R.id.custom_font);  
Typeface font = Typeface.createFromAsset(getAssets(), "Chantelli_Antiqua.ttf");  
txt.setTypeface(font); 

Mais je veux définir la police personnalisée par style/thème.

43
Gaurav Vashisth

Malheureusement, Android ne fournit pas le moyen rapide, facile et propre que vous recherchez pour changer la police de votre application entière. Mais récemment, j'ai étudié cette question et créé des outils qui vous permettent de modifier la police sans codage (vous pouvez le faire entièrement via xml, styles et même l'apparence du texte). Elles sont basées sur des solutions similaires à celles que vous voyez dans les autres réponses ici, mais permettent beaucoup plus de flexibilité. Vous pouvez lire tout cela à ce sujet sur ce blog , et voir le projet github ici .

Voici un exemple d'application de ces outils. Mettez tous vos fichiers de polices dans assets/fonts/. Ensuite, déclarez ces polices dans un fichier xml (par exemple, res/xml/fonts.xml) et chargez ce fichier au début de votre application avec TypefaceManager.initialize(this, R.xml.fonts); (par exemple, dans le onCreate de votre classe Application). Le fichier XML ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?>
<familyset>

    <!-- Some Font. Can be referenced with 'someFont' or 'aspergit' -->
    <family>
        <nameset>
            <name>aspergit</name>
            <name>someFont</name>
        </nameset>
        <fileset>
            <file>Aspergit.ttf</file>
            <file>Aspergit Bold.ttf</file>
            <file>Aspergit Italic.ttf</file>
            <file>Aspergit Bold Italic.ttf</file>
        </fileset>
    </family>

    <!-- Another Font. Can be referenced with 'anotherFont' or 'bodoni' -->
    <family>
        <nameset>
            <name>bodoni</name>
            <name>anotherFont</name>
        </nameset>
        <fileset>
            <file>BodoniFLF-Roman.ttf</file>
            <file>BodoniFLF-Bold.ttf</file>
        </fileset>
    </family>

</familyset>

Vous pouvez maintenant utiliser ces polices dans votre style ou xml (à condition d'utiliser les outils que j'ai mentionnés ci-dessus), en définissant l'attribut flFont dans le TextView com.innovattic.font.FontTextView personnalisé de votre mise en page xml. Ci-dessous, vous pouvez voir comment appliquer une police à tous les textes de votre application entière, en modifiant simplement 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>

Avec le res/layout/layout.xml joint:

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

N'oubliez pas d'appliquer le thème dans votre manifeste Android.

20
Jelle Fresen

Je pense que ceci est un double de cette question et celle-ci .

Dans mes activités d'exécution, j'utilise quelque chose comme ceci:

FontUtils.setCustomFont(findViewById(R.id.top_view), getAssets());

En XML:

        <TextView
            Android:id="@+id/my_label"
            Android:tag="condensed"
            Android:text="@string/label"
            ... />

Donc, théoriquement, vous pouvez créer un style et l'utiliser avec le code FontUtils/runtime. 

<style name="roboto_condensed">
    <item name="Android:tag">condensed,your-own-css-like-language-here</item>
</style>

Classe FontUtils:

public class FontUtils {
  private static Typeface normal;

  private static Typeface bold;

  private static Typeface condensed;

  private static Typeface light;

  private static void processsViewGroup(ViewGroup v, final int len) {

    for (int i = 0; i < len; i++) {
      final View c = v.getChildAt(i);
      if (c instanceof TextView) {
        setCustomFont((TextView) c);
      } else if (c instanceof ViewGroup) {
        setCustomFont((ViewGroup) c);
      }
    }
  }

  private static void setCustomFont(TextView c) {
    Object tag = c.getTag();
    if (tag instanceof String) {
      if (((String) tag).contains("bold")) {
        c.setTypeface(bold);
        return;
      }
      if (((String) tag).contains("condensed")) {
        c.setTypeface(condensed);
        return;
      }
      if (((String) tag).contains("light")) {
        c.setTypeface(light);
        return;
      }
    }
    c.setTypeface(normal);
  }

  public static void setCustomFont(View topView, AssetManager assetsManager) {
    if (normal == null || bold == null || condensed == null || light == null) {
      normal = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Regular.ttf");
      bold = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Bold.ttf");
      condensed = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Condensed.ttf");
      light = Typeface.createFromAsset(assetsManager, "fonts/roboto/Roboto-Light.ttf");
    }

    if (topView instanceof ViewGroup) {
      setCustomFont((ViewGroup) topView);
    } else if (topView instanceof TextView) {
      setCustomFont((TextView) topView);
    }
  }

  private static void setCustomFont(ViewGroup v) {
    final int len = v.getChildCount();
    processsViewGroup(v, len);
  }
}
12

En utilisant ma CustomTextView, vous spécifiez un nom de fichier de police dans votre dossier assets directement dans votre fichier de présentation XML.

Ma réponse est ici

4
Mohsen Afshin

Vous pouvez inclure votre type de police personnalisé dans le dossier des ressources et le récupérer à partir de là.

Déclarez les polices de caractères comme:

Typeface helveticaBold;
Typeface helveticaRegular;

dans onCreate () écrivez le code suivant:

helveticaBold = Typeface.createFromAsset(getAssets(), "helvetica_bold.ttf");
helveticaRegular = Typeface.createFromAsset(getAssets(), "helvetica_regular.ttf");

enfin, définissez le type de texte du texte TextView ou EditText comme suit:

editText.setTypeface(helveticaRegular);

c'est tout...

3
Sameer Bhide

Je pense que la réponse à votre question sera personnalisée TextView avec un paramètre XML supplémentaire, que vous pouvez inclure à vos thèmes. 

Vous pouvez analyser cette valeur dans le constructeur TextView (contexte de contexte, AttributeSet attrs) pour l'initialiser. Vérifiez this link par exemple pour définir des attributs personnalisés pour vos vues et les initialiser.

0
Roman Minenok