一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Android - Android如何動態(tài)調(diào)整應(yīng)用字體大小詳解

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

2022-02-22 15:31亂世白衣 Android

這篇文章主要給大家介紹了關(guān)于Android如何動態(tài)調(diào)整應(yīng)用字體大小的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

為什么要動態(tài)設(shè)置字體大小?由于項目面對的是中老年客戶項目中自帶的字體無法滿足客戶需求。

Android應(yīng)用字體大小默認隨系統(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層面進行處理才能自主控制字體大小變化,為了方便統(tǒng)一處理,將控制邏輯放在了Application中,下面貼出實例圖片及代碼(由于筆者水平實在是low,不會做滑動條來控制字體大小,因此,示例中使用了兩個TextView來點擊控制字體大小變化,哈哈哈~)

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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,并維護一個Activity列表。在onActivityCreated方法中我們可以監(jiān)控每個Activity的創(chuàng)建,當新建一個Activity時,獲取其Resource資源,進而判斷Configuration.fontScale數(shù)值是否與我們自己的fontScale數(shù)值(默認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重建,但幸運的是調(diào)用該方法,系統(tǒng)會觸發(fā)onSaveInstanceState回調(diào),因此強烈建議您在該回調(diào)方法中做好數(shù)據(jù)保存以便重建時恢復(fù)數(shù)據(jù)。

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:https://www.jianshu.com/p/f21ee733fd96

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: asianfemdom妍妍女王 | 美国69xxxx59 | 免费成人在线观看视频 | 大叔在线观看 | 欧美kkk4444在线观看 | 欧美伦乱 | pregnanthd产子 | 香蕉精品视频 | 久久全国免费久久青青小草 | 青草午夜精品视频在线观看 | 香蕉久久久 | 亚洲精品国产精麻豆久久99 | 国产成人综合精品一区 | 秋霞啪啪片 | 国产一级持黄大片99久久 | 99久久精品免费看国产四区 | 欧美 亚洲 综合 卡通 另类 区 | 国产午夜精品一区二区 | 国产第一福利影院 | 特黄特色大片免费视频播放 | 亚洲毛片网 | 成人四虎 | 国产亚洲精aa在线观看不卡 | 国产日韩欧美在线观看不卡 | 免费看国产一级特黄aa大片 | 单身男女韩剧在线看 | 丝瓜污污 | 国产精品免费小视频 | 亚洲乱码一区二区三区国产精品 | 成人午夜爽爽爽免费视频 | 人与动人物性行为zozo共患病 | 免费午夜网站 | www.久久av.com | 草榴色导航 | 九九九九在线精品免费视频 | 国内精品自产拍在线观看91 | 2019中文字幕在线视频 | 插得爽| 亚洲大片在线观看 | 公妇乱淫在线播放免费观看 | 女暴露狂校园裸露小说 |