Android实现应用内语言切换,android 应用内切换 多国语言
微信中可以动态设置,apk的语言版本,最近尝试实现了这个功能。
我们知道,android本身就支持多国语言版本的。
不过这个语言的切换 依赖于系统的的语言设置,见图
也依赖apk本身values多国语言的资源配置,en代表英文,zh代表中文
通常来说,在android系统上实现功能,最好的借助系统提供的api,如果没有明确的api,则想办法曲线救国。
实际上本博客内提供的实现方法,就是一个曲线救国的方式,下面就介绍下他的核心思路。
1.在values中配置相应的 语言资源
2.更改当前系统Configuration的配置信息
3.指定的控件重新加载 语言资源
第一步,大家都会,不多做介绍
第二步,直接上代码
// 刷新显示配置-
public void refreshTheLanguage() {
// 得到SharedPreferences中存储的 语言配置信息
String str = getLanguage();
Resources localResources = this.context.getResources();
// 判断 系统配置设置的 国家语言 是否和 SharedPreferences中存储的 一致
if (!localResources.getConfiguration().locale.getLanguage().equals(str)) {
// 得到系统配置信息类
Configuration localConfiguration = context.getResources()
.getConfiguration();
// 创建Locale类(简单理解为 所在地区 类)
Locale localLocale = new Locale(str);
// 设置默认地区信息
Locale.setDefault(localLocale);
// 将系统配置中的 地区信息 重新赋值为 自行设置的
localConfiguration.locale = localLocale;
DisplayMetrics localDisplayMetrics = localResources
.getDisplayMetrics();
// 更新系统的配置信息
localResources.updateConfiguration(localConfiguration,
localDisplayMetrics);
}
}第三步,view重新加载values资源即可
language.setText(R.string.language);
以微信为例子,设置语言的activity 肯定是 5级界面,到这来就涉及到 activity 和 activity之间 通信的问题。
方案有2种,1.广播, 2.使用观察者模式
我个人比较喜欢第二种,觉得观察者模式更轻一些。
1.创建一个被观察者
import java.util.Observable;
public class SwitchLanguageObservable extends Observable {
@Override
public void notifyObservers() {
setChanged();
super.notifyObservers();
}
@Override
public void notifyObservers(Object data) {
setChanged();
super.notifyObservers(data);
}
}
2.创建一个观察者,并提供回调方法
import java.util.Observable;
import java.util.Observer;
public class SwitchLanguageObserver implements Observer {
private ObserverChange mObserverChange;
public SwitchLanguageObserver(Observable simpleObservable) {
simpleObservable.addObserver(this);
}
@Override
public void update(Observable observable, Object data) {
if (mObserverChange != null) mObserverChange.observerChange();
}
public void setOnObserverChange(ObserverChange observerChange) {
this.mObserverChange = observerChange;
}
public interface ObserverChange {
public void observerChange();
}
3.将被观察 设置为全局对象,方便其他的activity调用
import com.example.demo.utils.LanguageSettingUtil;
import com.example.demo.utils.SwitchLanguageObservable;
import android.app.Application;
public class TestApplication extends Application {
/**
* 语言设置工具类
* */
private LanguageSettingUtil languageSetting;
/**
* 语言设置 被观察对象
* */
private SwitchLanguageObservable switchLangObs;
@Override
public void onCreate() {
super.onCreate();
// 注册 切换语言 工具类
LanguageSettingUtil.init(this);// 初始化
languageSetting = LanguageSettingUtil.get();// 检查是否已经初始化
switchLangObs = new SwitchLanguageObservable();
}
public LanguageSettingUtil getLanguageSetting() {
return languageSetting;
}
public SwitchLanguageObservable getSwitchLangObs() {
return switchLangObs;
}
}
4.能够切换语言的view,进行注册
language = (TextView) findViewById(R.id.language);
TestApplication app = (TestApplication) getApplication();
obs = app.getSwitchLangObs();
obser = new SwitchLanguageObserver(obs);
obser.setOnObserverChange(new ObserverChange() {
@Override
public void observerChange() {
language.setText(R.string.language);
}
});
5.被观察的对象,进行注册
import com.example.demo.utils.LanguageSettingUtil;
import com.example.demo.utils.SwitchLanguageObservable;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class SwitchLanguageActivity extends Activity implements OnClickListener {
private LanguageSettingUtil languageSetting;
private TextView switchCh, switchEn;
private SwitchLanguageObservable obs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_switch_language);
TestApplication app = (TestApplication) getApplication();
switchCh = (TextView) findViewById(R.id.switch_ch);
switchEn = (TextView) findViewById(R.id.switch_en);
switchCh.setOnClickListener(this);
switchEn.setOnClickListener(this);
languageSetting = app.getLanguageSetting();// 检查是否已经初始化
obs = app.getSwitchLangObs();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.switch_ch:
languageSetting.saveLanguage("zh");
LanguageSettingUtil.get().refreshLanguage();// 刷新
obs.notifyObservers();
finish();
break;
case R.id.switch_en:
languageSetting.saveLanguage("en");
LanguageSettingUtil.get().refreshLanguage();// 刷新
obs.notifyObservers();
finish();
break;
default:
break;
}
}上面的例子可以 看出代码步骤。
设置语言信息
languageSetting.saveLanguage("zh");刷新系统配置信息
LanguageSettingUtil.get().refreshLanguage();
被观察者发生变化
obs.notifyObservers();
观察者回调接口的实现方法,实现方法中重新设置了string信息
obser.setOnObserverChange(new ObserverChange() {
@Override
public void observerChange() {
language.setText(R.string.language);
}
});
然后app内 动态切换语言,就实现了。
源码链接http://download.csdn.net/detail/tianya19871987/8600969
Android实现应用内语言切换,android 应用内切换 多国语言相关推荐
- php 多语言cms,帝国cms模板实现多国语言切换
语言包解决方案(中英文为例,其他可自行添加) 1 .复制gb语言包,放入目录:edatalanguage中,重命名为:"zh"; 另加入语言包(除gb语言包以外):针对模板的中文进 ...
- c实现多语言编程,C/C++编程中多国语言处理
多国语言的存在.不同语言操作系统的存在,使得针对多语言的设计颇费周章,在编码上所付出的工作量也是可观的.所谓编码的问题,归结起来,就是二进制的编码以何种编码格式进行解析的问题.特别是在硬盘文件和内存数 ...
- c 微信项目开发多语言切换,微信小程序实现多国语言的切换
实现步骤: 1,首先在根目录新建文件夹 i18n,该文件夹下是 各种语言的js文件,如下图所示: 每个js文件内容和下面的图片类似: const languageMap = { "授权完成& ...
- 柔宇发布“手写神器”柔记樱雪白特别版,支持7国语言手写识别
深圳2018年9月26日电 /美通社/ -- 9月23日,柔宇科技在2018北京国际设计周期间首次对外发布柔宇科技的"柔性+"办公教育类升级新品 -- 柔记 RoWrite S 智 ...
- OEA 中的多国语言实现
本篇博客主要描述在 OEA 框架中的多国语言框架的原理及应用. 多国语言常见实现及原理分析 管理软件平台,一般来说,都应该支持多国语言,以支持应用程序走向国际化.OEA 最近也提供了多国语言框架,它可 ...
- c# winform项目多语言实现(支持简/繁/英三种语言),Winform中多国语言窗体设计.doc...
Winform中多国语言窗体设计.doc Winform中多国语言窗体的设计以及.NET中资源文件的使用 最近在做一些多国语言的软件,就学习了一下.NET中的多国语言相应知识,受益不少,下面我就简单介 ...
- 开篇和第一章:Mac OS X内核故事之“N国语言”
开篇声明: 1.写作动机和热情来自两方面:一是自乔帮主回归后,苹果公司经历了从濒临破产到全球市值第一的华丽转身,其产品风靡全球.我本人当了4年的苹果用户,3年的weiphoner,在坛子上 ...
- html如何支持多国语言,[MVC]建置多国语言系统之路
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 分享以ASP.NET MVC 3一步一步建置一个多国语言系统的方式 1.从Resource File开始 2.利用Str ...
- android 语音和输入法按钮切换,android 切换系统语言,输入法也随之切换
为什么有时候切换系统语言,输入法也随之切换 在系统有谷歌拼音输入法(Pinying输入法)和android 键盘输入法(Latin 输入法)的时候,此时系统的输入法不是第三方输入法. 在这时候去切换系 ...
最新文章
- 基于熵权法优劣解距离法_基于优劣解距离法的火电机组单辅机运行状态评估
- [训练日志] 7月22-31日
- 为更好提高客户对产品的满意度需要搞好站点建设问题
- 报错信息为:Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource
- BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
- 如何在SAP Spartacus category 页面里拿到当前的category信息
- Servlet的配置
- java版本号分段比较_java 实现比较版本号功能
- mysql myisam表加索引_MyISAM和InnoDB的索引实现
- nginx 分别对各个域名跳转
- vb treeview icon 可以使用位图吗_table标签经典案例,综合使用行合并与列合并实现html网页表格【2020网页综合笔记03】...
- jdk HashMap源码解读
- 为什么选择Mapabc
- IDEA 找不到或无法加载主类
- 计算机io设备是cpu控制的吗,I/O控制器及控制方式,了解一下
- 跑跑卡丁车rush服务器维护,跑跑卡丁车rush+操作技巧 跑跑卡丁车rush+基础设定
- Ubuntu 10.04小企鹅输入法安装
- 面向数据中心,浪潮存储双剑出鞘
- 云服务器安卓虚拟机,云服务器安装安卓虚拟机
- 网络中的代理(proxy)和NAT
热门文章
- lisp pause 坐标值_lisp 已知坐标绘断面图_测量并写坐标(表格方式) - AutoLISP/Visual LISP...
- python股票数据库_利用Python爬股票数据并存入数据库Mysql
- Unity Editor 编辑器扩展一 编辑器特殊文件夹及内置资源读取
- vivo和oppo通知权限弹窗
- java的Comparator接口详解
- 从零开始SpringCloud Alibaba实战(59)——过滤器filter、拦截器interceptor、和AOP的区别与联系及应用
- java获取网络时间_java获取网络当前时间
- c语言爱心加我爱你,急求一个输入“沈”就能显示“我爱你”然后有一个心型图案的c语言程序代码...
- VBA将ppt保存为html,2013版ppt怎么保存为网页
- IPC登录页风格汇总