Android app内语言环境切换

逻辑很简单:

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

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

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

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));
    }
}
时间: 2024-11-07 15:14:37

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

Android应用内语言切换实现

自定义控件系列结束了,打个回马枪,补上前段时间埋下的一个坑---"应用内语言切换".APP语言改变是一个Configuration,但是这个Configuration和android手机屏幕旋转有点不大一样.屏幕旋转的时候,会destroy当前页面,并进行重新绘制.而切换语言后不会重新绘制页面,所以这种情况的出现造成了网上的一知半解小伙伴们哀声一片,不是在咒骂api的坑爹,就是在卖力的另辟蹊径想尽办法解决问题.思路都是很好的,目的也是坚决的,可是方向是错误的,把哥哥我也给带进了坑了,爬

Android App内置键盘开发

参考: http://blog.csdn.net/hfsu0419/article/details/7924673 布局文件activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="match_parent"      android:layout_height="match

Android App内检测更新新版本APK

Rayland主板虽然作为一块基于Android的工控板,但是很多设备厂商并不想让用户看到Android系统信息.所以APK默认设置为开机启动项.img去除了Android头部和底部菜单.但是随之带来了APK更新的问题,传统的插入u盘,sd卡手动安装新版本APK的方式已经不够用了.所以我们需要点自动的东西. App内检测更新新版本APK 检测新版本APK 我们使用 四大组件之一的BroadcastReceiver来检测 sd卡或是u盘设备的接入. public class StorageMoun

学习Android app 的TAB页面切换

FragmentActivity+ ViewPager + FragmentManager实现 废话少说,直接上我今晚的成果: package com.itfanr.viewpagertab; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.support.v4.app.FragmentTransaction  ; import android.suppo

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

使用Java反射机制 IActivityManager与ActivityManagerNative都是非公开类,使用Java反射去调用其中的方法. 第一步.使用Android开放的api更改Configuration,同时把语言类型保存下来 第二步.Destroy当前页面,重新绘制才能更改语言类型 如果你的页面不是首页,你调用上述代码只会更新当前页面,压在栈中的Activity依然不会更新界面.比如微信设置语言成功后,会自动跳转到首页,当然首页的内容也是更新后的,它的实现方式也很简单,与我们上面

如何实现Visual Studio中的区域语言环境切换

最开始学习C#这门语言的时候,英文能力不够好,安装的中文版本的Visual Studio,现在工作有段时间了,公司又是个外企,慢慢不习惯中文版本的了,于是产生了想切换语言的想法,网上搜索了下,下载了个语言包,然后在VS中设置下. 从某种角度上讲,VS作为编程软件,供世界上很多程序员使用,各个程序员都有自己习惯的语言,于是展现在他们面前的UI就有各个语言的版本,这也就是国际化. 具体切换步骤如下: 在“工具”菜单中选择“选项” ->展开“选项”列表,选择“环境”,单击“区域设置”,在“语言”下拉列

Android 判断当前语言环境是否是中文环境

public static boolean isZh(Context context) {       Locale locale = context.getResources().getConfiguration().locale;       String language = locale.getLanguage();       if (language.endsWith("zh"))           return true;       else           re

App内切换语言

转载请注明出处 http://www.cnblogs.com/cnwutianhao/p/6746981.html 前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不用担心我findViewBy不到Id了哈哈,开个玩笑) 先上示例图: 代码实现: 布局文件(Data-Binding模式),很简单就是两行文字 <?xml version="1.

Android应用:横竖屏切换总结

眨眼间,已经到了2016你年春节前,离上一篇博客的时间已经有6个月多,回想起这半年的种种,不得不说,学习和工作实在是太忙了,或许这就是程序员的真实写照吧. 写博客之初,主要的目的还是为了把自己的学习痕迹记录下来,写的东西比较基础,也不多,算是一种督促,希望能坚持地学习下去,因为学识不存在暴发户,靠的是积累.如果对自己过去半年的学习给个评价,我还是比较满意的,前期定下来的目标都基本都达到了.单凭这个,我就觉得今年的新年会是个好年. 说完过去,那么接着就是将来.因为现在的工作环境上外网不大方便,而且