Android切換語言不退出App

1.需求

實現用戶選擇語言(未點擊下一步),更新當前界面UI,點擊下一步后,更新App的語言,并進行保存。

實現目標:

1.設置App的語言,本地進行保存

2.updateResources更新本地語言配置

2.實現代碼

1.LanguageManager

object LanguageManager {private const val PREFS_NAME = "settings"private const val LANGUAGE_KEY = "language"fun setLanguage(context: Context, language: String) {// 保存語言到 SharedPreferencesval sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)sharedPreferences.edit().putString(LANGUAGE_KEY, language).apply()// 更新資源updateResources(context, language)}fun getSavedLanguage(context: Context): String {// 如果沒有保存語言,默認使用系統語言val sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)return sharedPreferences.getString(LANGUAGE_KEY, Locale.getDefault().language) ?: Locale.getDefault().language}fun applyLanguage(context: Context): Context {// 獲取保存的語言并更新 Contextval language = getSavedLanguage(context)return updateResources(context, language)}private fun updateResources(context: Context, language: String): Context {val locale = Locale(language)Locale.setDefault(locale)val configuration = Configuration(context.resources.configuration)configuration.setLocale(locale)return context.createConfigurationContext(configuration)}
}

2.所有的基類進行設置,記得application在manifest應用

class MyApplication : Application() {override fun attachBaseContext(base: Context) {// 應用保存的語言super.attachBaseContext(LanguageManager.applyLanguage(base))}override fun onConfigurationChanged(newConfig: Configuration) {super.onConfigurationChanged(newConfig)// 當配置改變時(如系統語言切換),重新應用用戶選擇的語言LanguageManager.applyLanguage(this)}
}

BaseActivity

所有 Activity 自動應用語言配置:

open class BaseActivity : AppCompatActivity() {override fun attachBaseContext(newBase: Context) {// 為每個 Activity 更新語言配置super.attachBaseContext(LanguageManager.applyLanguage(newBase))}
}
open class BaseFragment : Fragment() {override fun onAttach(context: Context) {super.onAttach(LanguageManager.applyLanguage(context))  // 在這里更新語言}
}

3.為什么還要在 Activity 里設置語言?

通常,在 ActivityFragment 中設置語言是為了在運行時動態更新語言,尤其是當用戶切換語言后,某些界面可能需要重新加載來反映新的語言設置。

關鍵點:

  1. Application 中設置語言:可以在應用啟動時統一設置默認語言,確保語言配置在整個應用中生效。
  2. ActivityFragment 中設置語言:可以在用戶選擇語言并希望立即看到語言更改時,確保當前 ActivityFragment 界面更新。

4.在當前頁動態修改語言設置,動態修改文案,但是不點擊下一步時,不保存語言選擇。

   private fun updateLanguage(languageCode: String) {LogUtils.e("updateLanguage", languageCode)val finalCode: String = languageCodeval locale =if (languageCode == AppConstants.ZH_HANS) {Locale("zh","CN")} else if (languageCode == AppConstants.ZH_HANT) {Locale("zh","TW")} else Locale(finalCode)Locale.setDefault(locale)  // 設置默認語言val config = Configuration(resources.configuration)config.setLocale(locale)  // 修改當前界面語言// 創建新的 Context,并應用新的 Configurationval localizedContext = createConfigurationContext(config)// 將新的 Context 應用于當前頁面的 UIval resources = localizedContext.resourcesval displayMetrics = resources.displayMetricsresources.updateConfiguration(config, displayMetrics)// 使用新的語言設置刷新當前界面initData(localizedContext)  //界面將刷新以應用新的語言}

5.其余關鍵點

1.既然只刷新當前UI,就得生成新的context

localizedContext = createConfigurationContext(config)

2.initData里面就是數據賦值渲染UI,如果調用Activity的recreate方法會閃退,別調用。

6.保存設置退出App

需求:點擊語言后,保存語言設置,并且退出App

//點擊事件
binding.langCl.setOnClickListener {diaLog = LanguageBottomSheetFragment { selectedLanguage ->lifecycleScope.launch {LogUtils.e("onLanguageSelected", selectedLanguage)val saveSuccess = saveLanguageSuspend(requireContext(), selectedLanguage)if (saveSuccess) {diaLog?.binding?.root?.isEnabled = falsediaLog?.dismiss() // 關閉彈窗restartApp()} else {LogUtils.e("saveLanguage", "Failed to save language")}}}diaLog?.show(parentFragmentManager, "LanguageBottomSheet")
//             VIPBottomSheetFragment().show(parentFragmentManager, "VIPBottomSheet")}//保證保存成功suspend fun saveLanguageSuspend(context: Context, language: String): Boolean {return suspendCancellableCoroutine { continuation ->val sharedPreferences =context.getSharedPreferences(BaseApp.PREFS_NAME, Context.MODE_PRIVATE)val success = sharedPreferences.edit().putString(LANGUAGE_KEY, language).commit()continuation.resume(success)}}

tips:

1、**suspendCancellableCoroutine** 是 Kotlin 中用于將回調或異步操作轉化為掛起函數的工具。它是掛起函數的一部分,可以與協程一起工作,并且能夠在協程上下文被取消時進行適當的處理。

2、continuation.resume(success) 將保存結果恢復給掛起函數調用者。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65861.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一鍵獲取Linux主機配置信息shell腳本,含網卡詳情,網卡綁定等

cat > /tmp/get_os_info.sh <<"EOF"#!/bin/bashexport LANG=en_US.UTF-8# 如果 cat /proc/1/cgroup | grep docker | wc -l 大于0 或 systemd-detect-virt 返回 docker,則為 docker容器,# 如果 virt-what 返回 kvm或vmware或hyperv或xen、xen-hvm、lxc 或…

2 XDMA IP中斷

三種中斷 1. Legacy 定義&#xff1a;Legacy 中斷是傳統的中斷處理方式&#xff0c;使用物理中斷線&#xff08;例如 IRQ&#xff09;來傳遞中斷信號。缺點&#xff1a; 中斷線數量有限&#xff0c;通常為 16 條&#xff0c;限制了可連接設備的數量。中斷處理可能會導致中斷風…

【算法】時間復雜度以及O(N^2)的排序

目錄 1.常數時間的操作 2.時間復雜度 2.1.以選擇排序為例 2.2.O(n^2)從何而來 2.3.冒泡排序 2.3.1.抑或運算 2.4.插入排序 3.二分法 3.1.局部最小 4.遞歸 4.1.遞歸行為時間復雜度的估計 1.常數時間的操作 一個操作如果和樣本的數據量無關&#xff0c;每次都是固定時…

2021 年 3 月青少年軟編等考 C 語言五級真題解析

目錄 T1. 紅與黑思路分析T2. 密室逃脫思路分析T3. 求逆序對數思路分析T4. 最小新整數思路分析T1. 紅與黑 有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫一個程序,計算你總共能夠到達多少塊黑色的…

C# 或 .NetCore 如何使用 NPOI 導出圖片到 Excel 文件

今天在本文中&#xff0c;我們將嘗試使用NPOI庫將圖像插入到 Excel 文件的特定位置。請將以下邏輯添加到您的寫作方法中&#xff0c;在 Excel 文件中添加圖像&#xff08;JPEG、PNG&#xff09;,我已經有一個示例 jpeg 文件 - Read-write-excel-npoi.jpg &#xff0c;我們將嘗試…

【學習筆記】理解深度學習的基礎:機器學習

1. 機器學習基礎 1.1 機器學習的定義與重要性 定義&#xff1a;深度學習是機器學習的一種特定形式。為了深入理解深度學習&#xff0c;必須牢固掌握機器學習的基本原理。機器學習算法是一種能夠從數據中學習的算法&#xff0c;通過經驗E在任務T上提高性能度量P&#xff08;Mi…

Observability:將 OpenTelemetry 添加到你的 Flask 應用程序

作者&#xff1a;來自 Elastic jessgarson 待辦事項列表可以幫助管理與假期計劃相關的所有購物和任務。使用 Flask&#xff0c;你可以輕松創建待辦事項列表應用程序&#xff0c;并使用 Elastic 作為遙測后端&#xff0c;通過 OpenTelemetry 對其進行監控。 Flask 是一個輕量級…

使用Matplotlib顯示中文的方法

1 問題提出 使用圖1所示的代碼進行matplotlib繪圖時&#xff0c;因為其默認不支持中文&#xff0c;此時無法顯示正確內容&#xff0c;如圖2所示。 圖1 matplotlib繪圖繪圖代碼 圖2 matplotlib無法顯示中文 2 問題解決 2.1 設置全局字體 在圖1所示的代碼中&#xff0c;第13…

詳解opencv resize之INTER_LINEAR和INTER_AREA

一。先簡單介紹一下resize的用法 src&#xff1a;輸入圖&#xff0c; dst&#xff1a;輸出圖 dsize&#xff1a;輸出圖的寬高&#xff0c;如果dsize不為空&#xff08;即寬高都不是0&#xff09;&#xff0c;則以dsize為準進行resize。 fx, fy是放大縮小的比例&#xff0c;是…

UnityDemo-TheBrave-制作筆記

這是我跟著b站up主MStudio的視頻學習制作的&#xff0c;大體上沒有去做一些更新的東西&#xff0c;這里只是一個總的總結。在文章的最后&#xff0c;我會放上可以游玩該游戲的鏈接和exe可執行文件&#xff0c;不過沒有對游戲內容進行什么加工&#xff0c;只有基本的功能實現罷了…

使用LSTM預測股票收盤價

在金融數據預測中&#xff0c;LSTM&#xff08;長短期記憶網絡&#xff09;憑借其在時間序列數據建模中的優勢&#xff0c;成為了分析股票價格趨勢的熱門選擇。本篇博客將以完整的代碼實現為例&#xff0c;展示如何利用LSTM網絡對股票收盤價進行預測&#xff0c;并從數據處理到…

模擬SpringIOCAOP

一、IOC容器 Ioc負責創建&#xff0c;管理實例&#xff0c;向使用者提供實例&#xff0c;ioc就像一個工廠一樣&#xff0c;稱之為Bean工廠 1.1 Bean工廠的作用 先分析一下Bean工廠應具備的行為 1、需要一個獲取實例的方法&#xff0c;根據一個參數獲取對應的實例 getBean(…

預編譯SQL

預編譯SQL 預編譯SQL是指在數據庫應用程序中&#xff0c;SQL語句在執行之前已經通過某種機制&#xff08;如預編譯器&#xff09;進行了解析、優化和準備&#xff0c;使得實際執行時可以直接使用優化后的執行計劃&#xff0c;而不需要每次都重新解析和編譯。這么說可能有一些抽…

Centos9 + Docker 安裝 MySQL8.4.0 + 定時備份數據庫到本地

Centos9 + Docker 安裝 MySQL8.4.0 + 定時備份數據庫到本地 創建目錄,創建配置文件啟動容器命令定時備份MySQL執行腳本Linux每日定時任務命令文件內參數其他時間參數AT一次性定時任務創建目錄,創建配置文件 $ mkdir -p /opt/mysql/conf$ vim /opt/mysql/conf/my.cnf[mysql] #…

軟件測試預備知識⑥—搭建Web服務器

在軟件測試的廣闊領域中&#xff0c;搭建Web服務器是一項極為關鍵的技能。它不僅有助于模擬真實的應用環境&#xff0c;方便我們對Web應用進行全面且深入的測試&#xff0c;還能讓測試人員更好地掌控測試場景&#xff0c;提升測試效率與質量。接下來&#xff0c;讓我們一同深入…

計算機視覺算法實戰——打電話行為檢測

?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連? ??????? ??????????????? ?????? ? 1. 引言?? 隨著智能手機的普及&#xff0c;打電話行為檢測成為了計算機視…

事務的隔離級別和MDL

文章目錄 說明不同隔離級別可能發生的現象關鍵現象解釋MDL&#xff08;元數據鎖&#xff0c;Metadata Lock&#xff09;MDL 的作用MDL 的工作原理MDL 鎖的常見場景如何避免 MDL 阻塞 說明 本文章由大模型對話整理而來&#xff0c;如果有錯誤之處&#xff0c;請在評論區留言指正…

Linux第二課:LinuxC高級 學習記錄day01

0、大綱 0.1、Linux 軟件安裝&#xff0c;用戶管理&#xff0c;進程管理&#xff0c;shell 命令&#xff0c;硬鏈接和軟連接&#xff0c;解壓和壓縮&#xff0c;功能性語句&#xff0c;結構性語句&#xff0c;分文件&#xff0c;make工具&#xff0c;shell腳本 0.2、C高級 …

單片機存儲與計算機存儲:從微小到龐大的數據世界

單片機存儲與計算機存儲&#xff1a;從微小到龐大的數據世界 在現代電子設備中&#xff0c;存儲是至關重要的組成部分。無論是小巧的單片機&#xff0c;還是功能強大的計算機&#xff0c;存儲都扮演著不可或缺的角色。然而&#xff0c;單片機和計算機的存儲架構卻有著天壤之別…

ISP流程--去馬賽克詳解

前言 本期我們將深入討論ISP流程中的去馬賽克處理。我們熟知&#xff0c;彩色圖像由一個個像元組成&#xff0c;每個像元又由紅、綠、藍&#xff08;RGB&#xff09;三通道構成。而相機傳感器只能感知光的強度&#xff0c;無法直接感知光譜信息&#xff0c;即只有亮暗而沒有顏色…