111 Stimmen

Verwendung einer benutzerdefinierten Schriftart in Android

Ich möchte eine benutzerdefinierte Schriftart für meine Android-Anwendung verwenden, die ich gerade erst erstelle.
Ich kann die Schriftart jedes einzelnen Objekts von Code aus ändern, aber ich habe Hunderte von Objekten.

Also,

  • Gibt es eine Möglichkeit, dies über die XML-Datei zu tun? [Einstellung einer benutzerdefinierten Schriftart]
  • Gibt es eine Möglichkeit, dies vom Code aus an einer Stelle zu tun, um zu sagen, dass die gesamte Anwendung und alle Komponenten die benutzerdefinierte Schriftart anstelle der Standardschriftart verwenden sollen?

0voto

Richard Punkte 1665

Mir gefällt der Vorschlag von pospi. Warum nicht gehen Sie alle aus jeder Verwendung der "Tag"-Eigenschaft einer Ansicht (die Sie in XML angeben können - "Android:tag"), um alle zusätzlichen Styling, die Sie nicht in XML tun können angeben. Ich mag JSON, also würde ich einen JSON-String verwenden, um einen Schlüssel/Wert-Satz anzugeben. Diese Klasse macht die Arbeit - rufen Sie einfach Style.setContentView(this, [resource id]) in Ihrer Tätigkeit.

public class Style {

  /**
   * Style a single view.
   */
  public static void apply(View v) {
    if (v.getTag() != null) {
      try {
        JSONObject json = new JSONObject((String)v.getTag());
        if (json.has("typeface") && v instanceof TextView) {
          ((TextView)v).setTypeface(Typeface.createFromAsset(v.getContext().getAssets(),
                                                             json.getString("typeface")));
        }
      }
      catch (JSONException e) {
        // Some views have a tag without it being explicitly set!
      }
    }
  }

  /**
   * Style the passed view hierarchy.
   */
  public static View applyTree(View v) {
    apply(v);
    if (v instanceof ViewGroup) {
      ViewGroup g = (ViewGroup)v;
      for (int i = 0; i < g.getChildCount(); i++) {
        applyTree(g.getChildAt(i));
      }
    }
    return v;
  }

  /**
   * Inflate, style, and set the content view for the passed activity.
   */
  public static void setContentView(Activity activity, int resource) {
    activity.setContentView(applyTree(activity.getLayoutInflater().inflate(resource, null)));
  }
}

Natürlich müssen Sie mehr als nur die Schriftart verarbeiten, damit sich die Verwendung von JSON lohnt.

Ein Vorteil der Eigenschaft "tag" besteht darin, dass Sie sie auf einen Basisstil setzen können, den Sie als Thema verwenden, und sie somit automatisch auf alle Ihre Ansichten anwenden können. EDITAR: Dies führt unter Android 4.0.3 zu einem Absturz beim Aufblasen. Sie können weiterhin einen Stil verwenden und ihn auf einzelne Textansichten anwenden.

Eine Sache, die Sie im Code sehen werden - einige Ansichten haben ein Tag, ohne dass eines explizit gesetzt ist - bizarrerweise ist es die Zeichenfolge '' - was laut Google-Übersetzung "cut" auf Griechisch bedeutet! Was zur Hölle...?

0voto

Mohale Punkte 1340

Es sieht so aus, als ob die Verwendung von benutzerdefinierten Schriftarten mit Android O leicht gemacht wurde, Sie können grundsätzlich xml verwenden, um dies zu erreichen. Ich habe einen Link zu Android offizielle Dokumentation als Referenz beigefügt, und hoffentlich wird dies Menschen helfen, die noch diese Lösung benötigen. Arbeiten mit benutzerdefinierten Schriftarten in Android

0voto

Vic Punkte 1701

Es ist vielleicht nützlich zu wissen, dass Sie ab Android 8.0 (API-Level 26) folgende Möglichkeiten haben eine benutzerdefinierte Schriftart in XML verwenden .

Einfach ausgedrückt, können Sie dies auf folgende Weise tun.

  1. Legen Sie die Schriftart in den Ordner res/font .

  2. Verwenden Sie es entweder im Attribut eines Widgets

<Button android:fontFamily="@font/myfont"/>

oder legen Sie sie in res/values/styles.xml

<style name="MyButton" parent="android:Widget.Button">
    <item name="android:fontFamily">@font/myfont</item>
</style>

und verwenden Sie es als Stil

<Button style="@style/MyButton"/>

0voto

Dharmendra Punkte 114

Verwenden Sie das Attribut "fontPath" direkt in der Xml-Datei.

zur Verwendung in style.xml

<item name="fontPath">fonts/ProximaNovaSemibold.ttf</item>

zur Verwendung in der direkten Layout-Datei

fontPath="fonts/ProximaNovaBold.ttf"

(Hinweis: Das Attribut app/Android muss nicht im Präfix verwendet werden)

0voto

Richard Punkte 899

Ich weiß nicht, ob sich dadurch die gesamte Anwendung ändert, aber es ist mir gelungen, einige Komponenten zu ändern, die auf diese Weise nicht geändert werden konnten:

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Lucida Sans Unicode.ttf");
Typeface.class.getField("DEFAULT").setAccessible(true);
Typeface.class.getField("DEFAULT_BOLD").setAccessible(true);
Typeface.class.getField("DEFAULT").set(null, tf);
Typeface.class.getField("DEFAULT_BOLD").set(null, tf);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X