1. 程式人生 > >android全域性替換字型最新方案

android全域性替換字型最新方案

github上有一個Calligraphy庫,這個庫可以用來替換字型。核心程式碼就是CalligraphyLayoutInflater,它繼承預設LayoutInflater並且取代預設inflater來渲染整個圖層。當你設定好了字型以後自然就會用新字型來渲染文字。但問題是,現在這個庫只能實現一開始載入的時候渲染文字,那如果我正在一個Activity裡面操作,裡面有viewpager,fragment等一大堆元件,然後我切換進設定,在設定裡面修改字型再返回這個Activity,此時Activity並沒有經歷銷燬重新生成的過程,所以新字型無法自動應用上去,那怎麼辦呢?我們可以這麼辦

(1)配置Calligraphy庫

這一步可以解決在新生成的,或者銷燬再生成的Activity裡面的字型的變化。剩下的就是已經存在的Activity的元件,包括ListView等有快取機制的
參考:http://www.jianshu.com/p/5d4e6ae8ba4e

(2)遍歷修改

對於原生,自定義控制元件採用遍歷修改的方法(還剩下ListView和ViewPager等有快取機制的元件)

/**
     * 遍歷修改字型
     * @param root 根目錄,一般就是最頂層的LinearLayout
     */
    private void Traversal(ViewGroup root) {
        for
(int i = 0; i < root.getChildCount(); i++) { View view = root.getChildAt(i); if (view instanceof ViewGroup) { Traversal((ViewGroup) view); } else { String componentName = view.getClass().toString(); Log.e("name", componentName); checkForChange(view); } } } private
void checkForChange(View view) { if (view instanceof TextView) { ((TextView) view).setTypeface(mTypeface); } if (view instanceof Button) { ((Button) view).setTypeface(mTypeface); } if (view instanceof EditText) { ((EditText) view).setTypeface(mTypeface); } if (view instanceof AutoCompleteTextView) { ((AutoCompleteTextView) view).setTypeface(mTypeface); } if (view instanceof MultiAutoCompleteTextView) { ((MultiAutoCompleteTextView) view).setTypeface(mTypeface); } if (view instanceof CheckBox) { ((CheckBox) view).setTypeface(mTypeface); } if (view instanceof RadioButton) { ((RadioButton) view).setTypeface(mTypeface); } if (view instanceof ToggleButton) { ((ToggleButton) view).setTypeface(mTypeface); } if (view instanceof AppCompatTextView) { ((AppCompatTextView) view).setTypeface(mTypeface); } if (view instanceof AppCompatButton) { ((AppCompatButton) view).setTypeface(mTypeface); } if (view instanceof AppCompatEditText) { ((AppCompatEditText) view).setTypeface(mTypeface); } if (view instanceof AppCompatAutoCompleteTextView) { ((AppCompatAutoCompleteTextView) view).setTypeface(mTypeface); } if (view instanceof AutoCompleteTextView) { ((AutoCompleteTextView) view).setTypeface(mTypeface); } if (view instanceof AppCompatCheckBox) { ((AppCompatCheckBox) view).setTypeface(mTypeface); } if (view instanceof AppCompatRadioButton) { ((AppCompatRadioButton) view).setTypeface(mTypeface); } if (view instanceof AppCompatCheckedTextView) { ((AppCompatCheckedTextView) view).setTypeface(mTypeface); } }

(3)ListView更新字型

在getView函式中呼叫如下函式,然後在外部呼叫notifyDataSetChanged重新整理

private void updateTypeFace() {
        if (mTypeface == null) {
            TypeFaceApplication application = (TypeFaceApplication) ((Activity) mContext).getApplication();
            path = application.getCurrentAssetsPath();
            mTypeface = Typeface.createFromAsset(mContext.getAssets(), path);
        } else {
            TypeFaceApplication application = (TypeFaceApplication) ((Activity) mContext).getApplication();
            String currentPath = application.getCurrentAssetsPath();
            if (!currentPath.equals(path)) {
                path = currentPath;
                mTypeface = Typeface.createFromAsset(mContext.getAssets(), currentPath);
            }
        }
    }

(4)ViewPager

在Fragment的setUserVisibleHint中重新整理ListView,一般性的控制元件已經由之前的遍歷Traversal完成

最後貼一下Application的程式碼

public class TypeFaceApplication extends Application {

    private String assetsPath = "fonts/songti.TTF";

    @Override
    public void onCreate() {
        super.onCreate();
        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                .setDefaultFontPath(assetsPath)
                .setFontAttrId(R.attr.fontPath)
                .build());
    }

    public void change(String assetsPath) {
        this.assetsPath = assetsPath;
        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                .setDefaultFontPath(assetsPath)
                .setFontAttrId(R.attr.fontPath)
                .build());
    }

    public String getCurrentAssetsPath() {
        return assetsPath;
    }
}

相關推薦

android全域性替換字型最新方案

github上有一個Calligraphy庫,這個庫可以用來替換字型。核心程式碼就是CalligraphyLayoutInflater,它繼承預設LayoutInflater並且取代預設inflater來渲染整個圖層。當你設定好了字型以後自然就會用新字型來渲染文

怎樣“無痛”全域性替換字型

序 在 Android 下使用自定義字型已經是一個比較常見的需求了,最近也做了個比較深入的研究。 那麼按照慣例我又要出個一篇有關 Android 修改字型相關的文章,但是寫下來發現內容還挺多的,所以我決定將它們拆分一下,分幾篇來詳細的講解。主要會是一些常用的替換字型的方

全域性替換字型,開源庫更方便!!!

序 在 Android 下使用自定義字型已經是一個比較常見的需求了,最近也做了個比較深入的研究。 那麼按照慣例我又要出個一篇有關 Android 修改字型相關的文章,但是寫下來發現內容還挺多的,所以我決定將它們拆分一下,分幾篇來詳細的講解。主要會是一

Android全域性改變字型大小(坑)

這邊分享一個功能需求,全域性改變字型大小。當下的情景比較蛋疼…一個祖傳的專案,需要在半路新增這個需求,各種字型大小已經寫明在xml裡面了,dp,sp,甚至xp不等。當時內心是拒絕的,但是由於使用者反饋實在要做,而且app面向的使用者為老年使用者居多,還是決

android 全域性修改預設字型 沒有效果 填坑

最近有個需求要修改android app預設字型。網上有很多方法,但是最坑的是都沒有效果,但是最後還是解決了,不過不知道是什麼原因,如果知道的話歡迎留言(謝謝大家) 解決方案: 新增字型(.ttf)到工程目錄assets下, 我的是在assets在新建了一個fonts包。注意assets

Android 修改系統字型大小,導致頁面展示異常解決方案

Android系統預設是允許修改系統本身的字型大小的,導致頁面展示異常。 頁面展示異常是因為系統字型大小影響到了程式中字型的單位sp,所以解決此問題的方案1是,將佈局中字型大小的單位sp換成dp 解決方案2:重寫Activity或Application中的getResou

android-settings新增字型更換-中篇-FontStyle更換的解決方案

想到字型更換,首先最簡單的山寨方法,應該是想著可以替換系統的ttf字型檔案,然後手動重啟,系統根據目錄和名稱找到該檔案,構造Typeface,然後TextView使用這個Typeface。 但是,作為一個可以釋出的應用,應該不可以這樣(可以討論),方法應該有很多種,懇請各位

一種簡單的Android全域性更換字型的方法

在我們開發Android程式的時候通常會遇到更改全域性字型的需求,我目前能想到的解決方案有三種,下面我們來進行逐一分析: 第一種方式就是自定義控制元件,毫無疑問這個一定能解決我們的問題,只需要把我們之前用的控制元件換成我們自定義的控制元件就好,缺點是如果是多種控制元件我們就

Android開發— 反射更換Android全域性字型

Step1—新建繼承Application類的SetAppTypeface因為是全域性更換字型,所以需要使用Application來完成全域性的作用:以下是SetAppTypeface.java全部程式碼package pri.weiqiang.frontinstead; import java.lang.r

關於在android中,如何一步到位,全域性替換控制元件樣式的一些看法

在開發中,經常要替換RatingBar,EditText,RadioButton,CheckBox等等控制元件的樣式,如何替換,相信開發的朋友都會,我就簡單帶過。 比如:一個CheckBox: <LinearLayout xmlns:android

Android全域性更換字型的方法

在我們開發Android程式的時候通常會遇到更改全域性字型的需求,我目前能想到的解決方案有三種,下面我們來進行逐一分析:第一種方式就是自定義控制元件,毫無疑問這個一定能解決我們的問題,只需要把我們之前用的控制元件換成我們自定義的控制元件就好,缺點是如果是多種控制元件我們就要自

android屏幕適配方案

得到 glob src count span imageview ica height void 曾經看了android的屏幕適配方案,有非常多種。當中自己用到的一種是:先找一款主流的分辨率的android機,如:1080*1920的分辨率做基準,然後在這個基準

Android Freeline加速編譯App方案 使用和總結

lis adl ebo pos tps 螞蟻 優化 void list Freeline簡單介紹 在Android Studio還沒推出Instant Run功能之前,每次改動Android project項目時都要將整個項目又一次編譯一次,然後再將資

Android短輪詢解決方案——CountDownTimer+Handler

receiver font 網上 adc 開始 success 方法 www 請求 轉載請註明原文地址:http://www.cnblogs.com/ygj0930/p/7657194.html 一:應用場景 在諸如自動售賣機之類的掃碼支付場景中,客戶端

第一篇:安裝Android Studio問題及其解決方案

.com 及其 pla try onf posit blog chmod 提示 ubuntu18.04配置android studio3.2.1環境 1.JDK安裝與配置:https://www.cnblogs.com/yuanbo123/p/5819564.html(按照

Android左邊控制檯字型樣式設定

file->setting裡面:appearance,紅框裡面設定。(https://img-blog.csdn.net/20171027101134428?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbnp3MzE=/font/5a6L5

Android studio安裝】最新Android studio安裝教程以及問題(emulator: ERROR: unknown virtual device name)

安裝Android studio之前需要安裝JAVA,JAVA安裝教程網上很多本文不再陳述。可以參考連結: https://blog.csdn.net/u012934325/article/details/73441617/ 1、需要下載檔案 Android studio下載連結:ht

Android Studio替換AAR後原始碼不重新整理問題解決

替換aar檔案後,工程中的aar程式碼沒有改變。 試了網上各種重新編譯、重新整理重啟、同步gradle等方法,通通不好使。 我的環境: android studio版本是3.1.4,win7。 有兩種方法: 1.在工程根目錄進入.ideal\libraries目錄,如果引入

Unity Android il2cpp熱更解決方案

1. 簡介 這是Unity Android il2cpp熱更解決方案的Demo(Git地址)的說明。 和現有的熱更解決方案不同的是,他不會引入多餘的語言(只是UnityScript,c#...),對Unity程式設計和編碼沒有任何限制。你可以在預置和場景裡的GameObject上新增任何的Compnent

android 狀態列字型顏色設定 黑色 anctivity+dialog

package com.bufanbudao.kaikeba.utils; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import andr