Android APP修改全局字體

1.復(fù)制工具類(lèi)

import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.lang.reflect.Field;

public class TypefaceUtil {
    /**
     * 為給定的字符串添加HTML紅色標(biāo)記楚殿,當(dāng)使用Html.fromHtml()方式顯示到TextView 的時(shí)候其將是紅色的
     *
     * @param string 給定的字符串
     * @return
     */
    public static String addHtmlRedFlag(String string) {
        return "<font color=\"red\">" + string + "</font>";
    }

    /**
     * 將給定的字符串中所有給定的關(guān)鍵字標(biāo)紅
     *
     * @param sourceString 給定的字符串
     * @param keyword      給定的關(guān)鍵字
     * @return 返回的是帶Html標(biāo)簽的字符串苇侵,在使用時(shí)要通過(guò)Html.fromHtml()轉(zhuǎn)換為Spanned對(duì)象再傳遞給TextView對(duì)象
     */
    public static String keywordMadeRed(String sourceString, String keyword) {
        String result = "";
        if (sourceString != null && !"".equals(sourceString.trim())) {
            if (keyword != null && !"".equals(keyword.trim())) {
                result = sourceString.replaceAll(keyword, "<font color=\"red\">" + keyword + "</font>");
            } else {
                result = sourceString;
            }
        }
        return result;
    }

    /**
     * <p>Replace the font of specified view and it's children</p>
     * @param root The root view.
     * @param fontPath font file path relative to 'assets' directory.
     */
    public static void replaceFont(@NonNull View root, String fontPath) {
        if (root == null || TextUtils.isEmpty(fontPath)) {
            return;
        }


        if (root instanceof TextView) { // If view is TextView or it's subclass, replace it's font
            TextView textView = (TextView)root;
            int style = Typeface.NORMAL;
            if (textView.getTypeface() != null) {
                style = textView.getTypeface().getStyle();
            }
            textView.setTypeface(createTypeface(root.getContext(), fontPath), style);
        } else if (root instanceof ViewGroup) { // If view is ViewGroup, apply this method on it's child views
            ViewGroup viewGroup = (ViewGroup) root;
            for (int i = 0; i < viewGroup.getChildCount(); ++i) {
                replaceFont(viewGroup.getChildAt(i), fontPath);
            }
        }
    }

    /**
     * <p>Replace the font of specified view and it's children</p>
     * 通過(guò)遞歸批量替換某個(gè)View及其子View的字體改變Activity內(nèi)部控件的字體(TextView,Button,EditText,CheckBox,RadioButton等)
     * @param context The view corresponding to the activity.
     * @param fontPath font file path relative to 'assets' directory.
     */
    public static void replaceFont(@NonNull Activity context, String fontPath) {
        replaceFont(getRootView(context),fontPath);
    }


    /*
     * Create a Typeface instance with your font file
     */
    public static Typeface createTypeface(Context context, String fontPath) {
        return Typeface.createFromAsset(context.getAssets(), fontPath);
    }

    /**
     * 從Activity 獲取 rootView 根節(jié)點(diǎn)
     * @param context
     * @return 當(dāng)前activity布局的根節(jié)點(diǎn)
     */
    public static View getRootView(Activity context)
    {
        return ((ViewGroup)context.findViewById(android.R.id.content)).getChildAt(0);
    }

    /**
     * 通過(guò)改變App的系統(tǒng)字體替換App內(nèi)部所有控件的字體(TextView,Button,EditText,CheckBox,RadioButton等)
     * @param context
     * @param fontPath
     * 需要修改style樣式為monospace:
     */
//    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
//    <!-- Customize your theme here. -->
//    <!-- Set system default typeface -->
//    <item name="android:typeface">monospace</item>
//    </style>
    public static void replaceSystemDefaultFont(@NonNull Context context, @NonNull String fontPath) {
        replaceTypefaceField("MONOSPACE", createTypeface(context, fontPath));
    }

    /**
     * <p>Replace field in class Typeface with reflection.</p>
     */
    private static void replaceTypefaceField(String fieldName, Object value) {
        try {
            Field defaultField = Typeface.class.getDeclaredField(fieldName);
            defaultField.setAccessible(true);
            defaultField.set(null, value);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

2.修改style樣式

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <!-- Set system default typeface -->
    <item name="android:typeface">monospace</item>
    </style>

3.將需要用到的ttf文件導(dǎo)入src/main/assets/fonts文件夾下
4.application的onCreate方法中調(diào)用

TypefaceUtil.replaceSystemDefaultFont(this,"fonts/xxxx.ttf");
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末案训,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辟狈,更是在濱河造成了極大的恐慌,老刑警劉巖夏跷,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哼转,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡槽华,警方通過(guò)查閱死者的電腦和手機(jī)壹蔓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)猫态,“玉大人佣蓉,你說(shuō)我怎么就攤上這事披摄。” “怎么了勇凭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵疚膊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我虾标,道長(zhǎng)寓盗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任璧函,我火速辦了婚禮傀蚌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柳譬。我一直安慰自己喳张,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布美澳。 她就那樣靜靜地躺著销部,像睡著了一般。 火紅的嫁衣襯著肌膚如雪制跟。 梳的紋絲不亂的頭發(fā)上舅桩,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音雨膨,去河邊找鬼擂涛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛聊记,可吹牛的內(nèi)容都是我干的撒妈。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼排监,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狰右!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起舆床,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤棋蚌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后挨队,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谷暮,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年盛垦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了湿弦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腾夯,死狀恐怖颊埃,靈堂內(nèi)的尸體忽然破棺而出赌蔑,到底是詐尸還是另有隱情,我是刑警寧澤竟秫,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布娃惯,位于F島的核電站,受9級(jí)特大地震影響肥败,放射性物質(zhì)發(fā)生泄漏趾浅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一馒稍、第九天 我趴在偏房一處隱蔽的房頂上張望皿哨。 院中可真熱鬧,春花似錦纽谒、人聲如沸证膨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)央勒。三九已至,卻和暖如春澳化,著一層夾襖步出監(jiān)牢的瞬間崔步,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工缎谷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留井濒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓列林,卻偏偏與公主長(zhǎng)得像瑞你,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子希痴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1.復(fù)制工具類(lèi) 2.修改style樣式 3.將需要用到的ttf文件導(dǎo)入src/main/assets/fonts文...
    CarlWu_S閱讀 1,289評(píng)論 0 2
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程者甲,因...
    小菜c閱讀 6,450評(píng)論 0 17
  • 《羊的門(mén)》二月映泉――人生的法門(mén) 本章講述的是年輕縣長(zhǎng)呼國(guó)慶近來(lái)心頭煩亂,就去按摩店按摩的事情润梯。為了避人閑話过牙,他故...
    就這樣吧1234閱讀 334評(píng)論 0 0
  • 這只手甥厦,一握經(jīng)年 溫柔的掌紋 迤邐相連 無(wú)論你在右邊 還是左邊 這只手纺铭,一握經(jīng)年 初見(jiàn)的心思 旖旎未變 無(wú)論是在此...
    鹿將歸閱讀 535評(píng)論 7 10
  • 頒獎(jiǎng)典禮臺(tái)上的老師們分享著自己的事跡,臺(tái)下的老師們也有著各自的故事刀疙,雖然內(nèi)容各不相同舶赔,卻書(shū)寫(xiě)著同樣的感動(dòng)。幾天的相...
    山西長(zhǎng)治劉煥芬閱讀 1,074評(píng)論 2 3