android国际化代码动态更改语言环境

编程入门 行业动态 更新时间:2024-10-07 21:36:39

android国际化代码动态更改<a href=https://www.elefans.com/category/jswz/34/1770116.html style=语言环境"/>

android国际化代码动态更改语言环境

1.场景

我们都知道,在安卓做国际化的过程中,创建不同的value文件夹,引用不同value文件夹下的string就可以实现国际化,系统会根据手机的语言环境自动匹配语言环境,但有时候我们的应用动态设置语言的功能,这时,我们就要来动态更新我们应用的语言.

2.应用

一般像系统设置的一些配置信息,我们都可以使用Configuration来实现,此时我们会想到我们常用的onConfigurationChanged,我们常用的屏幕横竖屏切换系统会回调这个方法,此时需要在清单文件配置权限

<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>

还必须在清单文件中为Activity配置configChanges信息,否则系统不会回调onConfigurationChanged方法,而是重新走生命周期

<activityandroid:name="module.MyActivity"android:configChanges="orientation"android:screenOrientation="portrait" />

这时我们会发现,我们经常配置configChanges的不仅仅只有orientation啊 还有像keyboardHidden等等,确实是这样的,其实不仅仅横竖屏切换时系统会回调
onConfigurationChanged,还有像一些软键盘的隐藏和显示,系统语言环境的改变,系统字体大小的改变都会回调这个方法,接下来我们来看看configChanges的一些具体的属性.

3.configChanges的属性

这里感谢Android之屏幕方向改变以及onConfigurationChanged事件

ValueDescription
mcc移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
mnc移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
locale用户所在地区发生变化。
touchscreen屏幕发生变化,正常情况下一般不会发生
keyboard键盘模式发生变化,例如:用户接入外部键盘输入。
keyboardHidden系统键盘的显示和隐藏
navigation导航栏类型发生改变,正常情况下一般不会发生
orientation设备旋转,横向显示和竖向显示模式切换。
fontScale系统字体缩放发生改变

这里我们可以看到locale是表示地区发生改变的 ,其实这些属性都封装在Configuration里面 ,下面我们看一下怎么动态改变语言环境

4.动态更改语言环境

1.首先在我们选择语言的地方,本地保存设置的语言信息,并动态设置语言环境

private void ChooseLan() {AlertDialog dialog = new AlertDialog.Builder(this).setTitle("请选择语言").setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new String[]{"中文,English"}), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//获取系统配置的Locale信息Locale locale = getResources().getConfiguration().locale;switch (which) {case 0://在设置语言界面保存设置的语言环境,在用户重新进入应用时使应用处于设置后的SpUtils.putParam(MyActivity.this, "language", "chinese");//Locale赋值为当前设置的语言环境locale = Locale.SIMPLIFIED_CHINESE;break;case 1:SpUtils.putParam(MyActivity.this, "language", "english");locale = Locale.ENGLISH;break;}//设置语言环境setLan(locale);dialog.dismiss();}}).show();}private void setLan(Locale locale) {// 获得res资源对象Resources resources = getResources();// 获得配置信息对象Configuration config = resources.getConfiguration();// 获得屏幕参数:主要是分辨率,像素等。DisplayMetrics dm = resources.getDisplayMetrics();// 语言config.locale = locale;resources.updateConfiguration(config, dm);// 刷新activity才能马上奏效startActivity(new Intent().setClass(this,MyActivity.class));finish();}

2.在进入时,在我们的Application中首先判断用户有没有设置过语言环境,如果设置过就动态设置

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();setLan();}@Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);setLan();}/**设置语言信息*/private void setLan() {Locale locale ;String language = SpUtils.getStringParam(this, "language", "");if (TextUtils.isEmpty(language)){//用户没有设置,赋值为系统语言环境locale=getResources().getConfiguration().locale;}else {//用户设置过switch (language){case "chinese":locale=Locale.SIMPLIFIED_CHINESE;break;case "english":locale=Locale.ENGLISH;break;default:locale=getResources().getConfiguration().locale;break;}}// 获得res资源对象Resources resources = getResources();// 获得配置信息对象Configuration config = resources.getConfiguration();// 获得屏幕参数:主要是分辨率,像素等。DisplayMetrics dm = resources.getDisplayMetrics();// 语言config.locale = locale;//更新配置信息resources.updateConfiguration(config, dm);}}

Note:以上只演示了中英文的切换,支持安卓兼容的所有语言的切换,同时在value中有多语言的string资源才能生效.

5.扩展

由以上我们可以想到,其实Configuration 所有属性都可以这样动态设置,下面我们来试一下动态改变屏幕的横竖屏切换,不多说了,和设置语言是一样的,直接上代码

   //横竖屏切换int orientation;private void setOrientation() {orientation = getResources().getConfiguration().orientation;button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {switch (orientation){case Configuration.ORIENTATION_LANDSCAPE://横屏orientation = Configuration.ORIENTATION_PORTRAIT;break;case Configuration.ORIENTATION_PORTRAIT:orientation=Configuration.ORIENTATION_LANDSCAPE;break;}Resources resources = getResources();Configuration config = getResources().getConfiguration();config.orientation=orientation;DisplayMetrics displayMetrics = resources.getDisplayMetrics();resources.updateConfiguration(config,displayMetrics);}});}

更多推荐

android国际化代码动态更改语言环境

本文发布于:2024-03-23 15:09:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1739609.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:语言   代码   环境   动态   android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!