kotlin compose 实现应用内多语言切换(不重新打开App)

news2024/11/13 9:39:17

1. 示例图

2.具体实现

如何实现上述示例,且不需要重新打开App

①自定义 MainApplication  实现 Application ,定义两个变量:

class MainApplication : Application() {

     object GlobalDpData {
        var language: String = ""
        var defaultLanguage: String = "en"
    }
    override fun onCreate() {
        defaultLanguage = Locale.getDefault().language 
        val cacheLanguage = "保存在手机App本地的切换后的语言,可用sp或文件实现" 
        language = if (cacheLanguage.isNullOrEmpty()) { 
            defaultLanguage 
        } else  { 
            cacheLanguage 
        }
     }
}

②在baseActivity中添加语言实现

override fun attachBaseContext(baseContext: Context) {
    var language = MainApplication.GlobalDpData.language
    if (language.isEmpty()) {
        val default = MainApplication.GlobalDpData.defaultLanguage
        language = "保存在手机App本地的切换后的语言,可用sp或文件实现" 
    }
    // 创建一个ContextWrapper对象
    val context = newWrap(baseContext, language)
    // 将新的的Context设置给Activity
    super.attachBaseContext(context)
}
/**
 *  创建ContextWrapper对象,
 */
private fun newWrap(context: Context, language: String): ContextWrapper {
    val configuration = context.resources.configuration
    configuration.fontScale = 1f
    val locale = Locale(language)
    val localeList = LocaleList(locale)
    LocaleList.setDefault(localeList)
    configuration.setLocales(localeList)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1936088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你不是拖延,是没找对感觉!

在这个快节奏的时代,学习效率成为了我们每个人都渴望提升的关键能力。如何通过训练潜意识、深化知识印象、调整学习模式、找到适合自己的学习方法,以及利用倒计时硬逼法来提高执行力? 1. 训练潜意识:形成习惯 习惯的力量是巨大的…

使用python的pillow库生成图像验证码

一、pillow库 Pillow库:是一个功能强大的Python图像处理库,它提供了丰富的图像处理功能,使得用户能够方便地使用Python对图像进行各种操作。 二、图像验证码的分析 首先需要一个图像,图像上需要绘制验证码,还需要任意多…

博客最细 STM32CubeProgrammer 软件使用教程 二(学不会举报我)

前言:编写不易,仅供学习,参考,请勿转载 前言:本篇教程是 STM32CubeProgrammer 软件使用教程二,通过本篇你可以学习到,使用STM32CubeProgrammer读取 flash RAM,开启读写保护&#x…

科普文:TaobaoVM信息收集

网上关于TaobaoVM的信息很少,只有一个简介,就没有其他信息。毕竟这是别人企业自己的jvm,不可能公开。 Taobao VM 由AliJVM团队发布。阿里,国内使用Java最强大的公司,覆盖云计算、金融、物流、电商等众多领域&#xf…

Python和C++行人轨迹预推算和空间机器人多传感融合双图算法模型

🎯要点 🎯双图神经网络模型:最大后验推理和线性纠错码解码器 | 🎯重复结构和过约束问题超图推理模型 | 🎯无向图模型变量概率计算、和积消息传播图结构计算、隐马尔可夫模型图结构计算、矩阵图结构计算、图结构学习 |…

数据库MySQL学习第一天|了解数据库、数据类型、存储引擎、sql语言

文章目录 了解数据库什么是数据库数据库分类MySQL概念 数据类型整数类型小数类型日期类型文本,二进制类型 存储引擎种类引擎选择 sql主键和外键主键设计原则选取策略 外键索引 表与表的关联在语法上关联关系sql约束sql注入聚合函数常见查询关键字 了解数据库 什么是数据库 概…

网络安全协议系列

目录 一、安全协议的引入 1.TCP/IP协议族中普通协议的安全缺陷 1.信息泄露 2.信息篡改 3.身份伪装 4.行为否认 2.网络安全需求 二、网络安全协议的定义 三、构建网络安全协议所需的组件 1.加密与解密 2.消息摘要 3.消息验证码 4.数字签名 5.密钥管理 1.建立共享…

关于C#多个文本框输入的问题

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…

堆排序基本思想以及代码实现

1、基本思想 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(n*logn),它也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都大于或…

Vue3路由如何携带 # 路由模式选择

vue3中创建路由的时候,有两种可选模型 hash模式、HTML5模式、服务端渲染模式 createWebHashHistory(hash模式) const router createRouter({// hash模式,带 # 号history: createWebHashHistory(), //函数可携带参数,…

C++11 容器emplace方法刨析

如果是直接插入对象 push_back()和emplace_back()没有区别但如果直接传入构造函数所需参数&#xff0c;emplace_back()会直接在容器底层构造对象&#xff0c;省去了调用拷贝构造或者移动构造的过程 class Test { public:Test(int a){cout<<"Test(int)"<<…

使用Web控制端和轻量级客户端构建的开放Web应用防火墙(OpenWAF)

目录 1. 简介2. 项目结构3. Web控制端3.1. 功能概述3.2. 审计&#xff08;攻击&#xff09;日志查看3.3. 多个WAF的集中监控和操作3.4. 使用socket进行封装3.5. 日志的高效存储和检索&#xff08;Redis&#xff09; 4. 轻量级客户端4.1. 功能概述4.2. 对Web程序的防护4.3. 网络…

36.UART(通用异步收发传输器)-RS232(3)

&#xff08;1&#xff09;串口发送模块visio视图&#xff1a; &#xff08;2&#xff09;串口发送模块Verilog代码: /* 常见波特率&#xff1a; 4800、9600、14400、115200 在系统时钟为50MHz时&#xff0c;对应计数为&#xff1a; (1/4800) * 10^9 /20 -1 10416 …

鸿蒙语言基础类库:【@system.vibrator (振动)】

振动 说明&#xff1a; 本模块首批接口从API version 4开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。从API Version 8开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.vibrator]。该功能使用需要对应硬件支持&#xff0c;仅支持…

学生信息管理系统-优化版

springbootthymeleafmybatis 记录一下闲来无事&#xff0c;将之前做的1.0页面优化。 一、【管理员】首页 1、增加了【批量删除】、【导出学生信息】、【分页】、【统计及格率、平均分、优秀率】等功能。 2、将页面样式优化了一下&#xff0c;做的好看些 原来&#xff1a; 现…

.NET C# 配置 Options

.NET C# 配置 Options 使用 options 模式可以带来许多好处&#xff0c;包括清晰的配置管理、类型安全、易于测试和灵活性。但在使用过程中&#xff0c;也需要注意配置复杂性、性能开销和依赖框架等问题。通过合理设计和使用&#xff0c;可以充分发挥 options 模式的优势&#…

【链表】算法题(二) ----- 力扣/牛客

一、链表的回文结构 思路&#xff1a; 找到链表的中间节点&#xff0c;然后逆置链表的后半部分&#xff0c;再一一遍历链表的前半部分和后半部分&#xff0c;判断是是否为回文结构。 快慢指针找到链表的中间节点 slow指针指向的就是中间节点 逆置链表后半部分 逆置链表后半部分…

【JavaScript 算法】图的遍历:理解图的结构

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、深度优先搜索&#xff08;DFS&#xff09;深度优先搜索的步骤深度优先搜索的JavaScript实现 二、广度优先搜索&#xff08;BFS&#xff09;广度优先搜索的步骤 三、应用场景四、总结 图的遍历是图论中的基本操作之一&am…

安卓 mvp 的架构的详细介绍

MVP 架构介绍 MVP&#xff08;Model-View-Presenter&#xff09;是一种软件架构模式&#xff0c;常用于构建用户界面&#xff08;UI&#xff09;。它将应用程序的逻辑划分为三个部分&#xff1a;Model、View 和 Presenter。MVP 的主要目标是分离视图和业务逻辑&#xff0c;使代…

ECU通讯:CAN总线仿真测试

01.ECU 在软件定义汽车的大背景下&#xff0c;几乎每一个汽车功能都需要依靠ECU&#xff08;Electronic Control Unit&#xff0c;电子控制单元&#xff09;来实现&#xff1a;有些功能靠ECU独立实现&#xff0c;有些功能则需要多个ECU联合实现。总体来说&#xff0c;ECU绝大多…