微信中可以动态设置,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 应用内切换 多国语言相关推荐

  1. php 多语言cms,帝国cms模板实现多国语言切换

    语言包解决方案(中英文为例,其他可自行添加) 1 .复制gb语言包,放入目录:edatalanguage中,重命名为:"zh"; 另加入语言包(除gb语言包以外):针对模板的中文进 ...

  2. c实现多语言编程,C/C++编程中多国语言处理

    多国语言的存在.不同语言操作系统的存在,使得针对多语言的设计颇费周章,在编码上所付出的工作量也是可观的.所谓编码的问题,归结起来,就是二进制的编码以何种编码格式进行解析的问题.特别是在硬盘文件和内存数 ...

  3. c 微信项目开发多语言切换,微信小程序实现多国语言的切换

    实现步骤: 1,首先在根目录新建文件夹 i18n,该文件夹下是 各种语言的js文件,如下图所示: 每个js文件内容和下面的图片类似: const languageMap = { "授权完成& ...

  4. 柔宇发布“手写神器”柔记樱雪白特别版,支持7国语言手写识别

    深圳2018年9月26日电 /美通社/ -- 9月23日,柔宇科技在2018北京国际设计周期间首次对外发布柔宇科技的"柔性+"办公教育类升级新品 -- 柔记 RoWrite S 智 ...

  5. OEA 中的多国语言实现

    本篇博客主要描述在 OEA 框架中的多国语言框架的原理及应用. 多国语言常见实现及原理分析 管理软件平台,一般来说,都应该支持多国语言,以支持应用程序走向国际化.OEA 最近也提供了多国语言框架,它可 ...

  6. c# winform项目多语言实现(支持简/繁/英三种语言),Winform中多国语言窗体设计.doc...

    Winform中多国语言窗体设计.doc Winform中多国语言窗体的设计以及.NET中资源文件的使用 最近在做一些多国语言的软件,就学习了一下.NET中的多国语言相应知识,受益不少,下面我就简单介 ...

  7. 开篇和第一章:Mac OS X内核故事之“N国语言”

    开篇声明:       1.写作动机和热情来自两方面:一是自乔帮主回归后,苹果公司经历了从濒临破产到全球市值第一的华丽转身,其产品风靡全球.我本人当了4年的苹果用户,3年的weiphoner,在坛子上 ...

  8. html如何支持多国语言,[MVC]建置多国语言系统之路

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 分享以ASP.NET MVC 3一步一步建置一个多国语言系统的方式 1.从Resource File开始 2.利用Str ...

  9. android 语音和输入法按钮切换,android 切换系统语言,输入法也随之切换

    为什么有时候切换系统语言,输入法也随之切换 在系统有谷歌拼音输入法(Pinying输入法)和android 键盘输入法(Latin 输入法)的时候,此时系统的输入法不是第三方输入法. 在这时候去切换系 ...

最新文章

  1. 基于熵权法优劣解距离法_基于优劣解距离法的火电机组单辅机运行状态评估
  2. [训练日志] 7月22-31日
  3. 为更好提高客户对产品的满意度需要搞好站点建设问题
  4. 报错信息为:Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource
  5. BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
  6. 如何在SAP Spartacus category 页面里拿到当前的category信息
  7. Servlet的配置
  8. java版本号分段比较_java 实现比较版本号功能
  9. mysql myisam表加索引_MyISAM和InnoDB的索引实现
  10. nginx 分别对各个域名跳转
  11. vb treeview icon 可以使用位图吗_table标签经典案例,综合使用行合并与列合并实现html网页表格【2020网页综合笔记03】...
  12. jdk HashMap源码解读
  13. 为什么选择Mapabc
  14. IDEA 找不到或无法加载主类
  15. 计算机io设备是cpu控制的吗,I/O控制器及控制方式,了解一下
  16. 跑跑卡丁车rush服务器维护,跑跑卡丁车rush+操作技巧 跑跑卡丁车rush+基础设定
  17. Ubuntu 10.04小企鹅输入法安装
  18. 面向数据中心,浪潮存储双剑出鞘
  19. 云服务器安卓虚拟机,云服务器安装安卓虚拟机
  20. 网络中的代理(proxy)和NAT

热门文章

  1. lisp pause 坐标值_lisp 已知坐标绘断面图_测量并写坐标(表格方式) - AutoLISP/Visual LISP...
  2. python股票数据库_利用Python爬股票数据并存入数据库Mysql
  3. Unity Editor 编辑器扩展一 编辑器特殊文件夹及内置资源读取
  4. vivo和oppo通知权限弹窗
  5. java的Comparator接口详解
  6. 从零开始SpringCloud Alibaba实战(59)——过滤器filter、拦截器interceptor、和AOP的区别与联系及应用
  7. java获取网络时间_java获取网络当前时间
  8. c语言爱心加我爱你,急求一个输入“沈”就能显示“我爱你”然后有一个心型图案的c语言程序代码...
  9. VBA将ppt保存为html,2013版ppt怎么保存为网页
  10. IPC登录页风格汇总