中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android動態調整應用字體大小的案例

發布時間:2021-02-08 16:01:37 來源:億速云 閱讀:308 作者:小新 欄目:移動開發

這篇文章將為大家詳細講解有關Android動態調整應用字體大小的案例,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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

Android應用字體大小默認隨系統設置的字體大小而變化,但您可能不希望您的應用字體大小隨系統設置變化,想要自己控制,例如微信。本文簡單介紹一下如何實現應用字體大小動態調整而不是依賴系統設置

字體大小變化是由android.content.res.Configuration.class類中的fontScale控制的,因此,若想我們的應用字體大小變化不隨系統變化而是由我們自主控制,就需要我們修改fontScale為我們自己設置的數值。由于Android系統更新的問題,可能您無法通過網上的答案來實現您的目的。根據目前筆者的測試情況,我們需要從Activity層面進行處理才能自主控制字體大小變化,為了方便統一處理,將控制邏輯放在了Application中,下面貼出實例圖片及代碼(由于筆者水平實在是low,不會做滑動條來控制字體大小,因此,示例中使用了兩個TextView來點擊控制字體大小變化,哈哈哈~)

Android動態調整應用字體大小的案例

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<>();
  }
  // 禁止字體大小隨系統設置變化
  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實現ActivityLifecycleCallbacks接口,并注冊ActivityLifecycleCallbacks以便監控所有Activity,并維護一個Activity列表。在onActivityCreated方法中我們可以監控每個Activity的創建,當新建一個Activity時,獲取其Resource資源,進而判斷Configuration.fontScale數值是否與我們自己的fontScale數值(默認1.0,即大小沒有經過調整)相等,若數值不一致時,修改之。其實,只要我們通過一個Activity修改了Configuration.fontScale數值,那么所有其他Activity再獲取Configuration.fontScale數值時,其值均為我們修改過之后的數值。通過這一波操作,已經保證我們的應用的字體大小不隨系統設置變化了。

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

注意:recreate()方法會導致Activity重建,但幸運的是調用該方法,系統會觸發onSaveInstanceState回調,因此強烈建議您在該回調方法中做好數據保存以便重建時恢復數據。

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

關于“Android動態調整應用字體大小的案例”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东乡族自治县| 石门县| 小金县| 澳门| 辉县市| 绵阳市| 银川市| 石棉县| 义马市| 黄骅市| 南岸区| 朝阳县| 南溪县| 台安县| 潢川县| 张北县| 马关县| 望都县| 沛县| 三亚市| 阿鲁科尔沁旗| 西青区| 泗洪县| 菏泽市| 扎囊县| 旬邑县| 清镇市| 若尔盖县| 哈巴河县| 安泽县| 通河县| 乾安县| 乌恰县| 永寿县| 石棉县| 庆云县| 延吉市| 泰兴市| 金沙县| 孟村| 云安县|