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