Android如何動(dòng)態(tài)調(diào)整應(yīng)用字體大小詳解
前言
為什么要?jiǎng)討B(tài)設(shè)置字體大???由于項(xiàng)目面對(duì)的是中老年客戶(hù)項(xiàng)目中自帶的字體無(wú)法滿(mǎn)足客戶(hù)需求。
Android應(yīng)用字體大小默認(rèn)隨系統(tǒng)設(shè)置的字體大小而變化,但您可能不希望您的應(yīng)用字體大小隨系統(tǒng)設(shè)置變化,想要自己控制,例如微信。本文簡(jiǎn)單介紹一下如何實(shí)現(xiàn)應(yīng)用字體大小動(dòng)態(tài)調(diào)整而不是依賴(lài)系統(tǒng)設(shè)置
字體大小變化是由android.content.res.Configuration.class
類(lèi)中的fontScale控制的,因此,若想我們的應(yīng)用字體大小變化不隨系統(tǒng)變化而是由我們自主控制,就需要我們修改fontScale為我們自己設(shè)置的數(shù)值。由于Android系統(tǒng)更新的問(wèn)題,可能您無(wú)法通過(guò)網(wǎng)上的答案來(lái)實(shí)現(xiàn)您的目的。根據(jù)目前筆者的測(cè)試情況,我們需要從Activity層面進(jìn)行處理才能自主控制字體大小變化,為了方便統(tǒng)一處理,將控制邏輯放在了Application中,下面貼出實(shí)例圖片及代碼(由于筆者水平實(shí)在是low,不會(huì)做滑動(dòng)條來(lái)控制字體大小,因此,示例中使用了兩個(gè)TextView來(lái)點(diǎn)擊控制字體大小變化,哈哈哈~)
public class MainApplication extends Application implements Application.ActivityLifecycleCallbacks { private List<Activity> activityList; private float fontScale; private SharedPreferences preferences; private static MainApplication mainApplication; @Override public void onCreate() { super.onCreate(); init(); } private void init() { mainApplication = this; preferences = PreferenceManager.getDefaultSharedPreferences(this); fontScale = getFontScale(); registerActivityLifecycleCallbacks(this); } public static float getFontScale() { float fontScale = 1.0f; if (mainApplication != null) { fontScale = mainApplication.preferences.getFloat("fontScale", 1.0f); } return fontScale; } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { if (activityList == null) { activityList = new ArrayList<>(); } // 禁止字體大小隨系統(tǒng)設(shè)置變化 Resources resources = activity.getResources(); if (resources != null && resources.getConfiguration().fontScale != fontScale) { android.content.res.Configuration configuration = resources.getConfiguration(); configuration.fontScale = fontScale; resources.updateConfiguration(configuration, resources.getDisplayMetrics()); } activityList.add(activity); } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { if (activityList != null) { activityList.remove(activity); } } public static void setAppFontSize(float fontScale) { if (mainApplication != null) { List<Activity> activityList = mainApplication.activityList; if (activityList != null) { for (Activity activity : activityList) { if (activity instanceof SettingActivity) { continue; } Resources resources = activity.getResources(); if (resources != null) { android.content.res.Configuration configuration = resources.getConfiguration(); configuration.fontScale = fontScale; resources.updateConfiguration(configuration, resources.getDisplayMetrics()); activity.recreate(); if (fontScale != mainApplication.fontScale) { mainApplication.fontScale = fontScale; mainApplication.preferences.edit().putFloat("fontScale", fontScale).apply(); } } } } } } }
首先,我們需要讓Application實(shí)現(xiàn)ActivityLifecycleCallbacks接口,并注冊(cè)ActivityLifecycleCallbacks以便監(jiān)控所有Activity,并維護(hù)一個(gè)Activity列表。在onActivityCreated方法中我們可以監(jiān)控每個(gè)Activity的創(chuàng)建,當(dāng)新建一個(gè)Activity時(shí),獲取其Resource資源,進(jìn)而判斷Configuration.fontScale
數(shù)值是否與我們自己的fontScale數(shù)值(默認(rèn)1.0,即大小沒(méi)有經(jīng)過(guò)調(diào)整)相等,若數(shù)值不一致時(shí),修改之。其實(shí),只要我們通過(guò)一個(gè)Activity修改了Configuration.fontScale
數(shù)值,那么所有其他Activity再獲取Configuration.fontScale數(shù)值時(shí),其值均為我們修改過(guò)之后的數(shù)值。通過(guò)這一波操作,已經(jīng)保證我們的應(yīng)用的字體大小不隨系統(tǒng)設(shè)置變化了。
下面看如何動(dòng)態(tài)調(diào)整應(yīng)用字體大小,看一下setAppFontSize方法。該方法遍歷Activity列表,獲取Resource配置信息并修改其fontScale數(shù)值,需要注意的是,若想及時(shí)生效,需要調(diào)用Activity的recreate()
方法。
注意:recreate()
方法會(huì)導(dǎo)致Activity重建,但幸運(yùn)的是調(diào)用該方法,系統(tǒng)會(huì)觸發(fā)onSaveInstanceState回調(diào),因此強(qiáng)烈建議您在該回調(diào)方法中做好數(shù)據(jù)保存以便重建時(shí)恢復(fù)數(shù)據(jù)。
另外一個(gè)建議是:不要把字體大小設(shè)置選項(xiàng)層級(jí)埋的太深,最好放在首頁(yè),因?yàn)檫@樣放置,當(dāng)調(diào)整字體大小時(shí)只會(huì)導(dǎo)致首頁(yè)重建,不會(huì)影響替他頁(yè)面,將影響將到最小
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Android webView字體突然變小的原因及解決
- Android使用TypeFace設(shè)置TextView的文字字體
- Android開(kāi)發(fā)TextvView實(shí)現(xiàn)鏤空字體效果示例代碼
- 淺析Android加載字體包及封裝的方法
- Android開(kāi)發(fā)之FloatingActionButton懸浮按鈕基本使用、字體、顏色用法示例
- 詳解android 中文字體向上偏移解決方案
- Android Studio設(shè)置、改變字體和主題的方法
- android 更改TextView中任意位置字體大小和顏色的方法
- Android修改字體樣式的示例代碼
- Android字體相關(guān)知識(shí)總結(jié)
相關(guān)文章
android popuwindow點(diǎn)擊外部窗口不消失的實(shí)例
下面小編就為大家?guī)?lái)一篇android popuwindow點(diǎn)擊外部窗口不消失的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Android Kotlin 實(shí)現(xiàn)底部彈框日歷組件的案例
這篇文章主要介紹了Android Kotlin 實(shí)現(xiàn)底部彈框日歷組件的案例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-08-08Android開(kāi)發(fā)之圓角矩形創(chuàng)建工具RoundRect類(lèi)定義與用法分析
這篇文章主要介紹了Android開(kāi)發(fā)之圓角矩形創(chuàng)建工具RoundRect類(lèi)定義與用法,結(jié)合完整實(shí)例形式分析了Android圓角矩形工具類(lèi)的定義與簡(jiǎn)單使用技巧,需要的朋友可以參考下2018-01-01HttpURLConnection和okHttp兩種獲取網(wǎng)絡(luò)數(shù)據(jù)的實(shí)現(xiàn)方法
下面小編就為大家分享一篇HttpURLConnection和okHttp兩種獲取網(wǎng)絡(luò)數(shù)據(jù)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Android 使用AsyncTask實(shí)現(xiàn)多線(xiàn)程斷點(diǎn)續(xù)傳
本文將詳細(xì)講解如何使用AsyncTask來(lái)實(shí)現(xiàn)多線(xiàn)程的斷點(diǎn)續(xù)傳下載功能,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05Android中點(diǎn)擊事件的四種寫(xiě)法詳解
本篇文章主要介紹了Android中點(diǎn)擊事件的四種寫(xiě)法詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05