web-dev-qa-db-ja.com

Androidのテーマにカスタムフォントを追加する

Androidのテーマにカスタムフォントを追加する方法はありますか?

クイックヒント:カスタマイズAndroid Fonts を読みましたが、ここではテキストにカスタムフォントをプログラムで追加する必要があります。

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

ただし、スタイル/テーマごとにカスタムフォントを設定します。

43
Gaurav Vashisth

残念なことに、Androidは、アプリ全体のフォントを変更するための迅速で簡単できれいな方法を提供していません。しかし最近、この問題を調査し、いくつかのツールを作成しましたこれにより、コーディングなしでフォントを変更することができます(xml、スタイル、テキストの外観を使用してすべてを行うことができます)。これらは、他の回答で見られるような同様のソリューションに基づいていますが、はるかに柔軟性があります。 このブログ でそれに関するすべてを読むことができ、githubプロジェクト here を見ることができます。

これらのツールを適用する方法の例を次に示します。すべてのフォントファイルを_assets/fonts/_に入れます。次に、これらのフォントをxmlファイル(たとえば_res/xml/fonts.xml_)で宣言し、TypefaceManager.initialize(this, R.xml.fonts);を使用してアプリの早い段階でこのファイルを読み込みます(たとえば、アプリケーションクラスのonCreateで)。 xmlファイルは次のようになります。

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

これで、XMLレイアウトのカスタムTextView _com.innovattic.font.FontTextView_でflFont属性を設定することにより、これらのフォントをスタイルまたはxml(上記のツールを使用する場合)で使用できます。 _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>
_

付属の_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>
_

Androidマニフェストでテーマを適用することを忘れないでください。

20
Jelle Fresen

これは this questionthis one の複製だと思います。

ランタイムでのアクティビティでは、次のようなものを使用します。

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

XMLの場合:

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

したがって、理論的には、スタイルを作成してFontUtils/runtimeコードと一緒に使用できます。

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

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

CustomTextViewを使用して、XMLレイアウトファイルのassetsフォルダーに直接フォントファイル名を指定します。

私の答えは here です

4
Mohsen Afshin

アセットフォルダーにカスタムフォントタイプを含めて、そこから取得できます。

タイプフェイスを次のように宣言します。

Typeface helveticaBold;
Typeface helveticaRegular;

onCreate()で次のコードを記述します。

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

最後に、TextViewまたはEditTextのテキストの書体を次のように設定します。

editText.setTypeface(helveticaRegular);

それでおしまい...

3
Sameer Bhide

あなたの質問に対する答えは、あなたがテーマに含めることができる追加のXMLパラメータを持つカスタムTextViewであると思います。

コンストラクターTextView(Context context、AttributeSet attrs)でこの値を解析して、初期化できます。ビューのカスタム属性を定義して初期化する例については、 this リンクを確認してください。

0
Roman Minenok