it-swarm.com.de

Hinzufügen einer benutzerdefinierten Schriftart zum Thema in Android

Gibt es eine Möglichkeit, benutzerdefinierte Schriftarten in Designs in Android hinzuzufügen? 

Ich habe gelesen Schneller Tipp: Anpassen von Android-Schriftarten , aber hier müssen Sie dem Text programmgesteuert benutzerdefinierte Schriftarten hinzufügen.

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

Ich möchte jedoch die benutzerdefinierte Schriftart nach Stil/Thema festlegen.

43
Gaurav Vashisth

Leider bietet Android nicht die schnelle, einfache und saubere Möglichkeit, die Schriftart für Ihre gesamte App zu ändern. Aber in letzter Zeit habe ich mich mit dieser Angelegenheit befasst und einige Werkzeuge erstellt, mit denen Sie die Schriftart ohne Codierung ändern können (Sie können dies alles durch XML, Stile und sogar Textdarstellungen machen). Sie basieren auf ähnlichen Lösungen, wie Sie in den anderen Antworten hier sehen, ermöglichen jedoch weitaus mehr Flexibilität. Sie können alles darüber in diesem Blog lesen und das Github-Projekt hier sehen.

Hier ist ein Beispiel für die Anwendung dieser Tools. Legen Sie alle Ihre Schriftdateien in assets/fonts/ ab. Deklarieren Sie dann diese Schriftarten in einer XML-Datei (z. B. res/xml/fonts.xml) und laden Sie diese Datei früh in Ihrer App mit TypefaceManager.initialize(this, R.xml.fonts); (z. B. in onCreate Ihrer Application-Klasse). Die XML-Datei sieht folgendermaßen aus:

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

Jetzt können Sie diese Schriftarten in Ihrem Style oder XML verwenden (vorausgesetzt, Sie verwenden die oben genannten Tools), indem Sie das Attribut flFont im benutzerdefinierten TextView com.innovattic.font.FontTextView in Ihrem XML-Layout festlegen. Nachfolgend können Sie sehen, wie Sie eine Schrift auf alle Texte in Ihrer gesamten App anwenden können, indem Sie einfach res/values/styles.xml bearbeiten:

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

Mit dem beiliegenden res/layout/layout.xml:

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

Vergessen Sie nicht, das Design in Ihrem Android-Manifest anzuwenden.

20
Jelle Fresen

Ich denke, das ist ein Duplikat von dieser Frage und dieser .

In meinen Aktivitäten zur Laufzeit verwende ich so etwas:

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

In XML:

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

Theoretisch können Sie also einen Stil erstellen und ihn zusammen mit FontUtils/Laufzeitcode verwenden. 

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

FontUtils-Klasse:

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

Durch die Verwendung meiner CustomTextView geben Sie einen Namen der Schriftartdatei in Ihrem assets-Ordner direkt in Ihrer XML-Layoutdatei an.

Meine Antwort ist hier

4
Mohsen Afshin

Sie können Ihren benutzerdefinierten Schrifttyp in den Assets-Ordner aufnehmen und von dort abrufen.

Deklarieren Sie die Schriften als:

Typeface helveticaBold;
Typeface helveticaRegular;

in onCreate () schreibe den folgenden Code:

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

zum Schluss legen Sie die Schrift des TextView oder EditText-Texts wie folgt fest:

editText.setTypeface(helveticaRegular);

das ist es...

3
Sameer Bhide

Ich denke, die Antwort auf Ihre Frage wäre ein benutzerdefiniertes TextView mit zusätzlichen XML-Parametern, die Sie in Ihre Designs einfügen können. 

Sie können diesen Wert im Konstruktor TextView (Kontextkontext, AttributeSet-Attribute) parsen, um ihn zu initialisieren. Überprüfen Sie this link, um beispielsweise benutzerdefinierte Attribute für Ihre Ansichten zu definieren und zu initialisieren.

0
Roman Minenok