逻辑很简单:

1  app内所有activity继承自BaseActivity或BaseActivity派生出来的子类,BaseActivity中维护了一个静态的 app Activity访问栈,在创建和销毁时会执行压栈和出栈操作,所以mLocalStack内维持的是app中正在运行的activity。

2  将app的语言环境存储在SharedPreferences中,避免app重启时修改状态不改变;在BaseActivity创建时取出语言环境字符串并初始化Activity语言环境(initLang方法)。

3  在页面切换语言时,调用BaseActivity的switchLang方法,finish当前运行的所有activity,并跳转到app主页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public abstract class BaseActivity extends Activity {
    // activity访问栈
    private static Stack<BaseActivity> mLocalStack = new Stack<BaseActivity>();
    protected BaseActivity             mContext;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
 
        // 压栈
        mLocalStack.add(this);
 
        initLang();
    }
 
    @Override
    protected void onDestroy() {
        // 出栈
        mLocalStack.remove(this);
        super.onDestroy();
    }
 
    private void initLang() {
        Resources res = getResources();
        Configuration config = res.getConfiguration();
        Locale locale = Locale.getDefault();
        String langStr = "";
        //TODO 获取Sharedpreferences中存储的app语言环境
        if("zh".equals(langStr)){
            locale = Locale.CHINA;
        }else if("en".equals(langStr)){
            locale =  Locale.ENGLISH;
        }else if{
            //.....
        }
        config.locale = locale;
        res.updateConfiguration(config, res.getDisplayMetrics());
    }
     
    protected void switchLang(String newLang){
        //TODO 更新Sharedpreferences中存储的app语言环境
         
        // finish app内存中的所有activity
        while (0 != mLocalStack.size()) {
            mLocalStack.pop().finish();
        }
         
        // 跳转到app首页
        startActivity(MainActivity.class);
    }
     
    public void startActivity(Class<? extends BaseActivity> cls) {
        startActivity(new Intent(this, cls));
    }
}

Android app内语言环境切换的更多相关文章

  1. iOS开发——iOS国际化 APP内语言切换

    最近一个一直在迭代的老项目收到一份新的开发需求,项目需要做国际化适配,简体中文+英文.由于项目中采用了storyboard和纯代码两种布局方式,所以国际化也要同时实现.上网查了些资料,实现了更改系统语 ...

  2. Android应用内语言切换实现(转)

    使用Java反射机制 IActivityManager与ActivityManagerNative都是非公开类,使用Java反射去调用其中的方法. 第一步.使用Android开放的api更改Confi ...

  3. [Environment Build] 如何实现Visual Studio中的区域语言环境切换

    最开始学习C#这门语言的时候,英文能力不够好,安装的中文版本的Visual Studio,现在工作有段时间了,公司又是个外企,慢慢不习惯中文版本的了,于是产生了想切换语言的想法,网上搜索了下,下载了个 ...

  4. UWP 实现App多语言为所欲为切换

    为所欲为,嗯 话不多说,先看效果吧(事先说明,我的方法不是最好的,但是我用着最有效.) [吐槽一下博客园上传的图片,我的App敲鸡漂亮滴,自带亚克力效果,怎么图片上传上来这么多的噪点啊.] [ 商店地 ...

  5. App内切换语言

    前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不 ...

  6. Android原生多语言切换方案,兼容Android10

    前言 一个应用若需要国际化,至少需要支持中文和英语这两种语言,而同时随着谷歌的系统的更新,安卓系统可以设置当前语言的首选语言.因此,本文立足于此,多语言的切换方案为:App固定的文字内容,跟随系统,中 ...

  7. Android应用:横竖屏切换总结

    眨眼间,已经到了2016你年春节前,离上一篇博客的时间已经有6个月多,回想起这半年的种种,不得不说,学习和工作实在是太忙了,或许这就是程序员的真实写照吧. 写博客之初,主要的目的还是为了把自己的学习痕 ...

  8. android app性能优化大汇总(UI渲染性能优化)

    UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑 ...

  9. iOS APP语言国际化之应用内切换语言环境

    最近接了一个项目,需求是要做一款应用的英文版本,客户并不清楚,以为要另做一个APP.沟通后告诉他们在之前应用基础上加个国际化功能就好,把之前的语言国际化重新梳理记录一下. 一般设置更改本地语言环境后, ...

随机推荐

  1. json+一般处理程序读取数据库数据

    一般处理程序的语法结构 string jsoncallback = context.Request["jsoncallback"]; 声明变量 前台传值使用        stri ...

  2. 解析一下rtmp协议比较难懂的地方

    官方文档写的过于复杂,这里弄个简单的好入门的.chunk 分基础头,消息头,时间戳,数据部分基础头中第一个字节最高位的两个位是用来设置消息头的四种格式的,和基础头没关系,整个基础头有3个字段的长度存储 ...

  3. Git对于单个文件的分批提交方式的使用

    很多时候,对于一个大的文件,可能有的同学改完之后不想一次提交,想分批提交.但这个时候由于git add的机制往往add之后就是整个一个文件被放到stage区了,这个时候肯定会想能不能对一个文件可以进行 ...

  4. python of zip moudle

    reprinted:http://www.cnblogs.com/beginman/archive/2013/03/14/2959447.html A. code talk is cheap ,sho ...

  5. 自己总结python用xlrd\xlwt读写excel

    1.首先安装xlrd\xlwt模块 xlrd模块下载地址: https://pypi.python.org/pypi/xlrd xlwt模块下载地址: https://pypi.python.org/ ...

  6. underscorejs-filter学习

    2.6 filter 2.6.1 语法: _.filter(list, predicate, [context]) 2.6.2 说明: 对list集合的每个成员依次进行匹配(根据predicate迭代 ...

  7. angularJS学习笔记二

    angularJS四个特性 1.MVC <!doctype html> <html ng-app> <head> <meta charset="ut ...

  8. mysql存储过程的权限 definer

    mysql中用户对存储过程的权限有: ALTER ROUTINE 编辑或删除存储过程 CREATE ROUTINE 创建存储过程 EXECUTE运行存储过程 存储过程的创建者拥有存储过程的ALTER. ...

  9. Web Services 介绍

    Web Services 介绍 Web Services 是建立可交互操作的分布式应用程序的新平台 ; Web Services 平台是一套标准,它定义了应用程序如何在 Web 上进行交互操作 , 你 ...

  10. 运维小东西:每天备份sql到远程服务器上

    首先两台服务器可以无密码登录(这个方式比较简单,当然安全系数会降低) #ssh-keygen -t rsa #生成密钥发送给远程服务器上 #ssh-copy-id ~/root/id_rsa.pub ...