系统设置中 语言设置,中文或者英文
2017-05-18 18:15
495 查看
系统设置 设置中英文切换
方式一:直接调用系统类和方法
1,查看com.android.setting源码中,对中英文切换的大概流程,可以总结为:try { //tw add IActivityManager iActivityManager = ActivityManagerNative.getDefault(); Configuration configuration = iActivityManager.getConfiguration(); configuration.locale = locale; configuration.userSetLocale = true; iActivityManager.updateConfiguration(configuration); //提交到系统数据存储,需要在应用声明,不需要 //BackupManager.dataChanged("com.android.providers.settings"); }catch (Exception e){ XLog.i("updateLocale fail!.....", e); }
这些类和方法都是只有系统应用才能访问,在标准sdk中是无法访问到的。可以通过系统提供的jar包 framework-base_2.jar
为了AndroidStudio能够编译并找到这些类,gradle中加入这些配置:
allprojects { repositories { jcenter() } gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add('-Xbootclasspath/p:userlib/framework-base_2.jar') } } }
然后加入作为外部引用的jar包:
dependencies { provided files('../userlib/framework-base_2.jar') }
但是为了在编译过程中能够通过,并且优先选择系统里面的class文件,需要 app.iml 中找到
<orderEntry type="library" exported="" name="framework-base_2" level="project" /> <orderEntry type="jdk" jdkName="Android API 19 Platform" jdkType="Android SDK" />
将系统更jar放到 Android API前面,调用系统jar的有点在于方便,前提是,jar包中提供的类和方法必须在你机器系统中能够找到。
方法二:通过反射设置中英文切换
反射调用的流程大致与上面相同,只不过写起来和看起来复杂一点:try { Object objIActMag, objActMagNative; Class clzIActMag = Class.forName("android.app.IActivityManager"); Class clzActMagNative = Class.forName("android.app.ActivityManagerNative"); Method mtdActMagNative$getDefault = clzActMagNative.getDeclaredMethod("getDefault"); objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative); Method mtdIActMag$getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration"); Configuration config = (Configuration) mtdIActMag$getConfiguration .invoke(objIActMag); // set the locale to the new value config.locale = locale; //持久化 config.userSetLocale = true; Class clzConfig = Class.forName("android.content.res.Configuration"); java.lang.reflect.Field userSetLocale = clzConfig.getField("userSetLocale"); userSetLocale.set(config, true); // 此处需要声明权限:android.permission.CHANGE_CONFIGURATION // 会重新调用 onCreate(); Class[] clzParams = { Configuration.class }; Method mtdIActMag$updateConfiguration = clzIActMag .getDeclaredMethod("updateConfiguration", clzParams); mtdIActMag$updateConfiguration.invoke(objIActMag, config); BackupManager.dataChanged("com.android.providers.settings"); } catch (Exception e) { XLog.e("updateLocale fail!", e); }
以上是基于代码实现的设置中英文切换,实际操作过程中遇到,系统设置设置完中英文后,按主页键进入launcher,launcher一直无响应,网上分析的原因是,设置中英文以后,会导致launcher 执行 onstop -> ondestroy ,然后重新 oncreate然后,按主页键时,从后台切到前台,launcher很长一段时间无响应。
解决方法,需要在清单文件对Activity设置 configChanges 属性,然后再Activity 中重新在onConfigurationChanged中重写更新ui
<activity android:name="com.inspur.livetv.weblauncher.Main" android:configChanges="layoutDirection|locale" android:clearTaskOnLaunch="true" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="nosensor" >
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); XLog.d("[Main.onConfigurationChanged] !"); updateTextUI(); }
至此,中英文问题已经解决。
相关文章推荐
- 自己在安装centos 系统时, 是使用英文安装 成功,现在系统语言为英语,如何设置为中文?
- 将Redhat6.5 的系统语言将中文设置为英文
- android 中对 gps 默认关闭+语言默认中文的设置+时区设置+修改系统名字+修改系统默认时间+修改屏幕休眠时间+修改usb debug默认关闭+mtk修改默认字体大小
- android 中对 gps 默认关闭+语言默认中文的设置+时区设置+修改系统名字+修改系统默认时间
- 英文win 7 系统中文乱码,修改默认语言
- 开源管理系统OSSIM设置 语言为中文简体
- Android系统语言默认设置为简体中文
- mac下获取系统当前输入法语言类别,以及设置输入法语言为英文
- 跳转到系统相簿界面,通讯录界面等后标题显示的英文,关键是手机已经设置显示中文了。
- 如何将windows版的vim界面语言(默认为中文)设置成英文(转)
- NetBeans IDE 语言设置 把中文改为英文
- 中文环境下设置GVIM的界面、菜单、提示为英文语言
- 将Visual Studio Ultimate 2012 RC语言设置从中文换成英文
- Ubuntu英文系统LaTex中文设置
- Fedora 9 系统语言设置为英文后不能使用SCIM的解决(转载)
- Ubuntu 英文系统设置中文输入法
- Android系统语言默认设置为简体中文
- Iphone5 语言设置成英文后如何发中文短信
- Debian 系统修改语言:设置成英文
- 调用系统自带的相机,日历等,将英文设置为中文