国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android如何動態(tài)調(diào)整應(yīng)用字體大小詳解

2019-12-12 00:52:35
字體:
供稿:網(wǎng)友

前言

為什么要動態(tài)設(shè)置字體大?。坑捎陧椖棵鎸Φ氖侵欣夏昕蛻繇椖恐凶詭У淖煮w無法滿足客戶需求。

Android應(yīng)用字體大小默認(rèn)隨系統(tǒng)設(shè)置的字體大小而變化,但您可能不希望您的應(yīng)用字體大小隨系統(tǒng)設(shè)置變化,想要自己控制,例如微信。本文簡單介紹一下如何實現(xiàn)應(yīng)用字體大小動態(tài)調(diào)整而不是依賴系統(tǒng)設(shè)置

字體大小變化是由android.content.res.Configuration.class類中的fontScale控制的,因此,若想我們的應(yīng)用字體大小變化不隨系統(tǒng)變化而是由我們自主控制,就需要我們修改fontScale為我們自己設(shè)置的數(shù)值。由于Android系統(tǒng)更新的問題,可能您無法通過網(wǎng)上的答案來實現(xiàn)您的目的。根據(jù)目前筆者的測試情況,我們需要從Activity層面進(jìn)行處理才能自主控制字體大小變化,為了方便統(tǒng)一處理,將控制邏輯放在了Application中,下面貼出實例圖片及代碼(由于筆者水平實在是low,不會做滑動條來控制字體大小,因此,示例中使用了兩個TextView來點(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實現(xiàn)ActivityLifecycleCallbacks接口,并注冊ActivityLifecycleCallbacks以便監(jiān)控所有Activity,并維護(hù)一個Activity列表。在onActivityCreated方法中我們可以監(jiān)控每個Activity的創(chuàng)建,當(dāng)新建一個Activity時,獲取其Resource資源,進(jìn)而判斷Configuration.fontScale數(shù)值是否與我們自己的fontScale數(shù)值(默認(rèn)1.0,即大小沒有經(jīng)過調(diào)整)相等,若數(shù)值不一致時,修改之。其實,只要我們通過一個Activity修改了Configuration.fontScale數(shù)值,那么所有其他Activity再獲取Configuration.fontScale數(shù)值時,其值均為我們修改過之后的數(shù)值。通過這一波操作,已經(jīng)保證我們的應(yīng)用的字體大小不隨系統(tǒng)設(shè)置變化了。

下面看如何動態(tài)調(diào)整應(yīng)用字體大小,看一下setAppFontSize方法。該方法遍歷Activity列表,獲取Resource配置信息并修改其fontScale數(shù)值,需要注意的是,若想及時生效,需要調(diào)用Activity的recreate()方法。

注意:recreate()方法會導(dǎo)致Activity重建,但幸運(yùn)的是調(diào)用該方法,系統(tǒng)會觸發(fā)onSaveInstanceState回調(diào),因此強(qiáng)烈建議您在該回調(diào)方法中做好數(shù)據(jù)保存以便重建時恢復(fù)數(shù)據(jù)。

另外一個建議是:不要把字體大小設(shè)置選項層級埋的太深,最好放在首頁,因為這樣放置,當(dāng)調(diào)整字體大小時只會導(dǎo)致首頁重建,不會影響替他頁面,將影響將到最小

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 威远县| 揭东县| 辽阳县| 建德市| 阳原县| 天峻县| 宁化县| 临邑县| 佳木斯市| 原平市| 景宁| 马边| 贵定县| 茶陵县| 加查县| 龙泉市| 西吉县| 海丰县| 泰安市| 麟游县| 罗江县| 武安市| 天柱县| 北辰区| 余干县| 富民县| 纳雍县| 克东县| 阳原县| 青冈县| 那坡县| 东明县| 准格尔旗| 伊川县| 舒城县| 泸西县| 邢台市| 江达县| 江油市| 景宁| 长寿区|