首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈。

最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先。实现了中文,英文,泰语的切换。测试机器 Nexus5(Android p),HUAWEI荣耀9青春版(8.0.0),XIAOMI mi 4LTE(6.0.1)。看下效果

language.gif

完整的例子在底部

实现步骤

首先需要新建对应语言环境下的资源文件

微信截图_20180605205842.png

对于Android7.0及以上版本

定义一个BaseActivity,重写attachBaseContext方法,在此方法里进行语言切换

public class BaseActivity extends AppCompatActivity {

/**

* 此方法先于 onCreate()方法执行

* @param newBase

*/

@Override

protected void attachBaseContext(Context newBase) {

//获取我们存储的语言环境 比如 "en","zh",等等

String language = SpUtil.getInstance(App.getContext()).getString(SpUtil.LANGUAGE);

//attach 对应语言环境下的context

super.attachBaseContext(LanguageUtil.attachBaseContext(newBase, language));

}

}

LanguageUtil中的attachBaseContext()方法

public static Context attachBaseContext(Context context, String language) {

Log.d(TAG, "attachBaseContext: "+Build.VERSION.SDK_INT);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

return updateResources(context, language);

} else {

return context;

}

}

@TargetApi(Build.VERSION_CODES.N)

private static Context updateResources(Context context, String language) {

Resources resources = context.getResources();

Locale locale = LanguageUtil.getLocaleByLanguage(language);

Configuration configuration = resources.getConfiguration();

configuration.setLocale(locale);

configuration.setLocales(new LocaleList(locale));

return context.createConfigurationContext(configuration);

}

在attachBaseContext()方法中,我们判断一下,如果当前api大于24,那么就调用updateResources()方法更新context。

定义好BaseActivity以后,我们只需要让我们的Activity都继承这个基类即可。

对于Android7.0及以下版本

自定义Application并在AndroidManifest.xml文件中声明,在Application的onCreate()方法中,调用更换语言的方法即可。

public class App extends Application {

private static Context context;

private final String TAG = getClass().getSimpleName();

@Override

public void onCreate() {

super.onCreate();

context = this;

/**

* 对于7.0以下,需要在Application创建的时候进行语言切换

*/

String language = SpUtil.getInstance(this).getString(SpUtil.LANGUAGE);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {

LanguageUtil.changeAppLanguage(App.getContext(), language);

}

}

public static Context getContext() {

return context;

}

}

微信截图_20180605211204.png

LanguageUtil中的changeAppLanguage方法

/**

* @param context

* @param newLanguage 想要切换的语言类型 比如 "en" ,"zh"

*/

@SuppressWarnings("deprecation")

public static void changeAppLanguage(Context context, String newLanguage) {

if (TextUtils.isEmpty(newLanguage)) {

return;

}

Resources resources = context.getResources();

Configuration configuration = resources.getConfiguration();

//获取想要切换的语言类型

Locale locale = getLocaleByLanguage(newLanguage);

configuration.setLocale(locale);

// updateConfiguration

DisplayMetrics dm = resources.getDisplayMetrics();

resources.updateConfiguration(configuration, dm);

}

经过上面的操作就可以在7.0以下实现应用内切换语言。

手动切换语言

定义一个ChangeLanguageActivity

public void onClick(View view) {

String language = null;

switch (view.getId()) {

case R.id.btn_chinese:

//切换为简体中文

language = LanguageType.CHINESE.getLanguage();

break;

case R.id.btn_english:

//切换为英语

language = LanguageType.ENGLISH.getLanguage();

break;

case R.id.btn_thailand:

//切换为泰语

language = LanguageType.THAILAND.getLanguage();

break;

default:

break;

}

changeLanguage(language);

}

/**

* 如果是7.0以下,我们需要调用changeAppLanguage方法,

* 如果是7.0及以上系统,直接把我们想要切换的语言类型保存在SharedPreferences中,然后重新启动MainActivity即可

* @param language

*/

private void changeLanguage(String language) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {

LanguageUtil.changeAppLanguage(App.getContext(), language);

}

SpUtil.getInstance(this).putString(SpUtil.LANGUAGE, language);

Intent intent = new Intent(this, MainActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

finish();

}

如果是7.0以下,我们需要调用changeAppLanguage方法, 如果是7.0及以上系统,直接把我们想要切换的语言类型保存在SharedPreferences中,然后重新启动MainActivity即可。

如果控件尺寸固定,当切换语言的时候,文字长短发生变化如何解决?

可以使用google提供的新特性来解决。

Android切换泰语,Android应用内切换语言相关推荐

  1. Android实现app内的语言切换功能

    我在目前所在的公司负责一个app项目的维护,最近需要对这个项目进行国际化,适配10多个国家的语言,在实现国际化过程中,遇到了很多问题,最麻烦的就是翻译了,得一个个将翻译从excel复制到资源文件中,还 ...

  2. nodejs html多语言切换,利用 nodejs 自动生成 Android 语言包实现应用内切换多语言的方案...

    Android 默认的多语言支持 在 Android 工程的 res 目录下,通过定义对应的语言文件夹名称就可以实现多语言支持 // 手动切换语言 Resources resources = getR ...

  3. Android实现应用内语言切换,android 应用内切换 多国语言

    微信中可以动态设置,apk的语言版本,最近尝试实现了这个功能. 我们知道,android本身就支持多国语言版本的. 不过这个语言的切换 依赖于系统的的语言设置,见图 也依赖apk本身values多国语 ...

  4. Android 8.0 App内切换语言不生效的问题记录

    国内大部分简单应该都只做了中文简体版,但是有部分项目需要面向国际化,甚至可能就是主打国外市场.因此我们有时候会遇到需要APP内做多语言切换的功能需求. 如何做多语言切换,网上资料还是很多的,本文也不是 ...

  5. Android的Activity屏幕切换动画(一)-左右滑动切换

    为什么80%的码农都做不了架构师?>>>    这段时间一直在忙Android的项目,总算抽出点时间休息一下,准备把一些项目用到的Android经验分享一下. 在Android开发过 ...

  6. android 如何监听应用前后台切换

    今天,简单讲讲android如何判断应用切换到后台和应用切换到前台. 这个其实很简单,之前需要做一个功能,当app由后台进入前台时需要完成一些逻辑操作,所以在网上查找如何判断app由后台进入前台,最终 ...

  7. 转 Android的Activity屏幕切换动画(一)-左右滑动切换

    这段时间一直在忙Android的项目,总算抽出点时间休息一下,准备把一些项目用到的Android经验分享一下. 在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下 ...

  8. android实现3种定位的切换,Android 滑动定位+吸附悬停效果实现

    在前两篇文章中,分别介绍了tablayout+scrollview 和 tablayout+recyclerview 实现的滑动定位的功能,文章链接: Android 实现锚点定位 Android t ...

  9. android fragment实例化,Android使得Fragment 切换时不重新实例化

    以前实现Fragment的切换都是用replace方法实现 public void startFragmentAdd(Fragment fragment) { FragmentManager frag ...

最新文章

  1. 唱好铁血丹心谐音正规_济南公司起名:四个字寓意好的公司名字怎么样选择?...
  2. java中怎样避免方法被重写
  3. c+和python的区别-python和c先学哪个
  4. 9、play中缓存的使用
  5. python去停用词用nltk_使用nltk删除英文停用词
  6. 论文浅尝 - IJCAI2020 | KGNN:基于知识图谱的图神经网络预测药物与药物相互作用...
  7. deep learning for symbolic mathematics论文梳理
  8. 【zabbix系列】报警系统的设置和排除
  9. MATLAB编程与应用系列-第3章 矩阵运算(4)
  10. 苹果Mac经典办公套件:Microsoft 365 支持辅助功能,高效工作
  11. Yarn 调度器Scheduler详解
  12. vuex实例方法replaceState解决vuex页面刷新数据丢失问题
  13. 凸二次规划的解法(旋转算法)
  14. 使用javascript下载网络图片
  15. 教你快速打粤语正字 讯飞输入法语音输入1分钟400字
  16. 阿里资深架构师推荐:浅谈异地多活及阿里云容灾经验分享
  17. C语言 绘制漂亮的六叶图案
  18. 论文阅读:social lstm:Human Trajectory Prediction in Crowded Spaces
  19. 计算机网络复习zucc
  20. 天蓝色在ps中的色值_天蓝色AI服务在游戏世界中的作用

热门文章

  1. 如果你也会C#,那不妨了解下F#(6):面向对象编程之“类”
  2. 利用Excel VBA实现批量数据分组转置
  3. Android之解决TabLayout里面每个Tab项的间距和修改指示线的长度(非反射)和修改选中字体大小
  4. Source Insight之Relation Window Properties配置和一些快捷键
  5. Android 之View绘图原理总结
  6. python 数据分析找到老外最喜欢的中国美食【完整代码】
  7. php邮件发送tp,Thinkphp5 邮件发送Thinkphp发送邮件
  8. 被清华免试录取的围棋天才,横扫60位围棋大师的最强AI,竟然都输给了高中生!?...
  9. 这几道挑战极限的烧脑题,烧脑到爽爽爽爽爽!
  10. 鸿蒙手机启动器apk下载,澪Pro启动器本体下载最新版