324

アプリで Roboto light フォントを使用しています。フォントを設定するにはandroid:fontFamily="sans-serif-light"、すべてのビューに追加する必要があります。Roboto フォントをアプリ全体のデフォルト フォント ファミリとして宣言する方法はありますか? 私はこのように試しましたが、うまくいかなかったようです。

<style name="AppBaseTheme" parent="android:Theme.Light"></style>

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:fontFamily">sans-serif-light</item>
</style>
4

16 に答える 16

314

答えはイエスです。

クラス用TextViewのグローバル Roboto ライト:Button

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
    <item name="android:buttonStyle">@style/RobotoButtonStyle</item>
</style>

<style name="RobotoTextViewStyle" parent="android:Widget.TextView">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

<style name="RobotoButtonStyle" parent="android:Widget.Holo.Button">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

リストthemes.xmlから必要なスタイルを選択するだけで、元のスタイルに基づいてカスタム スタイルを作成できます。最後に、アプリケーションのテーマとしてスタイルを適用します。

<application
    android:theme="@style/AppTheme" >
</application>

Roboto などの組み込みフォントでのみ機能しますが、それが問題でした。カスタム フォント (アセットからロードされたものなど) の場合、このメソッドは機能しません。

編集 08/13/15

AppCompat テーマを使用している場合は、忘れずにandroid:プレフィックスを削除してください。例えば:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
    <item name="buttonStyle">@style/RobotoButtonStyle</item>
</style>

には接頭辞がbuttonStyle含まれていませんが、含まれている必要があることに注意してください。android:textViewStyle

于 2013-05-06T20:55:10.667 に答える
35

以下のアップデートを読む

新しいフォントの埋め込みで同じ問題が発生し、最終的に TextView を拡張して typefont を内部に設定するようになりました。

public class YourTextView extends TextView {

    public YourTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public YourTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public YourTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        Typeface tf = Typeface.createFromAsset(context.getAssets(),
            "fonts/helveticaneue.ttf");
        setTypeface(tf);
    }
}

後ですべての要素で TextView 要素を から に変更する必要があります。また、Eclipse で UI-Creator を使用すると、TextView が正しく表示されないことがあります。私のために働く唯一のものでした...

アップデート

現在、リフレクションを使用して、TextView を拡張せずにアプリケーション全体の書体を変更しています。このSO投稿をチェックしてください

更新 2

API レベル 26 以降、「サポート ライブラリ」で利用可能

android:fontFamily="@font/embeddedfont"

詳細情報: XML のフォント

于 2013-05-06T20:14:27.447 に答える
5

アプリ全体でこれを行う別の方法は、この回答に基づいてリフレクションを使用することです

public class TypefaceUtil {
    /**
     * Using reflection to override default typefaces
     * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE
     * OVERRIDDEN
     *
     * @param typefaces map of fonts to replace
     */
    public static void overrideFonts(Map<String, Typeface> typefaces) {
        try {
            final Field field = Typeface.class.getDeclaredField("sSystemFontMap");
            field.setAccessible(true);
            Map<String, Typeface> oldFonts = (Map<String, Typeface>) field.get(null);
            if (oldFonts != null) {
                oldFonts.putAll(typefaces);
            } else {
                oldFonts = typefaces;
            }
            field.set(null, oldFonts);
            field.setAccessible(false);
        } catch (Exception e) {
            Log.e("TypefaceUtil", "Can not set custom fonts");
        }
    }

    public static Typeface getTypeface(int fontType, Context context) {
        // here you can load the Typeface from asset or use default ones
        switch (fontType) {
            case BOLD:
                return Typeface.create(SANS_SERIF, Typeface.BOLD);
            case ITALIC:
                return Typeface.create(SANS_SERIF, Typeface.ITALIC);
            case BOLD_ITALIC:
                return Typeface.create(SANS_SERIF, Typeface.BOLD_ITALIC);
            case LIGHT:
                return Typeface.create(SANS_SERIF_LIGHT, Typeface.NORMAL);
            case CONDENSED:
                return Typeface.create(SANS_SERIF_CONDENSED, Typeface.NORMAL);
            case THIN:
                return Typeface.create(SANS_SERIF_MEDIUM, Typeface.NORMAL);
            case MEDIUM:
                return Typeface.create(SANS_SERIF_THIN, Typeface.NORMAL);
            case REGULAR:
            default:
                return Typeface.create(SANS_SERIF, Typeface.NORMAL);
        }
    }
}

次に、フォントをオーバーライドしたいときはいつでも、メソッドを呼び出して、次のように書体のマップを与えることができます。

Typeface regular = TypefaceUtil.getTypeface(REGULAR, context);
Typeface light = TypefaceUtil.getTypeface(REGULAR, context);
Typeface condensed = TypefaceUtil.getTypeface(CONDENSED, context);
Typeface thin = TypefaceUtil.getTypeface(THIN, context);
Typeface medium = TypefaceUtil.getTypeface(MEDIUM, context);
Map<String, Typeface> fonts = new HashMap<>();
fonts.put("sans-serif", regular);
fonts.put("sans-serif-light", light);
fonts.put("sans-serif-condensed", condensed);
fonts.put("sans-serif-thin", thin);
fonts.put("sans-serif-medium", medium);
TypefaceUtil.overrideFonts(fonts);

完全な例のチェック

これは、Android SDK 21 以降でのみ機能します。以前のバージョンの場合は、完全な例を確認してください。

于 2015-10-20T12:00:58.587 に答える
1

Android は、アプリ全体にフォントを適用するためのサポートをあまり提供していません (この問題を参照してください)。アプリ全体のフォントを設定するには、次の 4 つのオプションがあります。

  • オプション 1: リフレクションを適用してシステム フォントを変更する
  • オプション 2: カスタム フォントが必要なビューごとにカスタム ビュー クラスを作成し、サブクラス化します。
  • オプション 3: 現在の画面のビュー階層をトラバースするビュー クローラーを実装する
  • オプション 4: サード パーティのライブラリを使用します。

これらのオプションの詳細については、こちらを参照してください。

于 2016-03-24T17:26:45.783 に答える
0

app の書体をnormalsansserifまたはmonospace(カスタム フォントではなく) に設定するだけで、これを行うことができます。

テーマを定義し、android:typeface属性を で使用する書体に設定しますstyles.xml

<resources>

    <!-- custom normal activity theme -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!-- other elements -->
        <item name="android:typeface">monospace</item>
    </style>

</resources>

AndroidManifest.xmlファイル内のアプリ全体にテーマを適用します。

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application
        android:theme="@style/AppTheme" >
    </application>
</manifest>

アンドロイドリファレンス

于 2016-11-03T06:57:24.253 に答える