如何在android APP中设置系统语言

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在android APP中设置系统语言相关的知识,希望对你有一定的参考价值。

设置达到的效果

在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成,下次重新打开 App ,也是用户设置的语言。

工具

编程软件;

实现步骤

在不同的 value 文件夹下添加不同语言的 string.xml 文件,项目添加了英文、简体中文、繁体中文三种语言,如下图所示:

Configuration 包含了设备的所有的配置信息,这些配置信息会影响应用获取的资源,更新 Configuration 中的 locale 属性。

App 有个启动页 WelcomeActivity,类似微信那个小人启动页,如果从欢迎页重启,并不是一个好的体验,应该和微信的语言设置一样,直接回到 HomeActivity ,而不是从 WelcomeActivity 重新打开。

App 存在某个 activity 和当前设置页 activity 不在一个 task 栈内的话(比如从某个通知页用 FLAG_ACTIVITY_NEW_TASK 启动的一个 activity),就不用应用语言设置。

在BaseActivity中实现语言切换代码:


设置界面中的实现自然就是更新sharedPreferences 中的设置,然后发送EventBus就行了。

参考技术A 一般设置里面,可以设置中英文子类的,如果是自己开发的app的话,可以在工程中导入自己的字体库,这样就可以设置界面上的文字了。 参考技术B android APP中设置系统语言可以通过反射机制。

private void updateLanguage(Locale locale)
try
Object objIActMag, objActMagNative;
Class clzIActMag = Class.forName("android.app.IActivityManager");
Class clzActMagNative = Class.forName("android.app.ActivityManagerNative");
Method mtdActMagNative$getDefault = clzActMagNative.getDeclaredMethod("getDefault");
// IActivityManager iActMag = ActivityManagerNative.getDefault();
objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
// Configuration config = iActMag.getConfiguration();
Method mtdIActMag$getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration");
Configuration config = (Configuration) mtdIActMag$getConfiguration.invoke(objIActMag);
config.locale = locale;
// iActMag.updateConfiguration(config);
// 此处需要声明权限:android.permission.CHANGE_CONFIGURATION
// 会重新调用 onCreate();
Class[] clzParams = Configuration.class ;
Method mtdIActMag$updateConfiguration = clzIActMag.getDeclaredMethod(
"updateConfiguration", clzParams);
mtdIActMag$updateConfiguration.invoke(objIActMag, config);
catch (Exception e)
e.printStackTrace();

根据服务器响应在Android App中设置时区

【中文标题】根据服务器响应在Android App中设置时区【英文标题】:Set Time Zone in Android App on the basis of server response 【发布时间】:2017-05-05 14:23:06 【问题描述】:

我正在做一些工作,场景是什么 ,我从服务器接收日期和时间作为数据字段。 即 2016-12-20T16:22:00+05:00。 我有一个微调器,其中

*

(+12:00 到 -12:00)每小时值

* 现在,我需要根据微调器值转换此日期和时间。 即如果微调器选择了 +12:00 然后它会像这样 2016-12-21T04:22:00+12:00。 请提出解决方案。 谢谢你:)

【问题讨论】:

你的问题不清楚。请详细说明 ***.com/questions/22814263/… 参考这个:) 如果用户选择了+12:00,是否要将时间增加12小时 是的,如果加上 +12 使时间 24+ 那么日期也应该改变。 您从服务器获取时间的格式和区域设置 【参考方案1】:

尝试使用下面的 Java 字符串函数

String time="2016-12-20T16:22:00+05:00";
String[] s =time.split("'+'");
String time1=s[0];


    String value=value from spinner;
    SimpleDateFormat readDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    readDate.setTimeZone(TimeZone.getTimeZone("GMT")); // missing line
    Date date = null;
    try 
        date = readDate.parse(time1);
     catch (ParseException e) 
        e.printStackTrace();
    
    SimpleDateFormat writeDate = new SimpleDateFormat("dd.MM.yyyy, HH.mm.ss");
    writeDate.setTimeZone(TimeZone.getTimeZone("GMT+"+value));
//final time string    
String s1 = writeDate.format(date);

【讨论】:

亲爱的 Rajesh,您的解决方案部分正确,但只设置了 GMT 时间,我需要更改日期以及如果添加的时间超过了数字 24。那么我需要注意年份的变化和月也是如此。即,如果我从服务器获得时间(2016-12-31T22:22:22+05:00)并且我选择的 GMT 是 +12:00,那么它会像这样 2017-1-1T05:22:22+12:00请注意不同的日期 我明白你需要什么。查看上面的新代码! 你的解决方案是对的 :) 位错误更正在逗号内使用“+”并使用字符串 s1。 好的..将其标记为正确答案,以便帮助其他人。【参考方案2】:

试试这个方法

public String convertTimeZone(String date, String timeZone) throws ParseException 
    StringBuffer buffer = new StringBuffer(date);
    date = buffer.reverse().toString().replaceFirst(":","");
    date = new StringBuffer(date).reverse().toString();
    SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    inFormat.setTimeZone(TimeZone.getTimeZone("GMT" + timeZone));
    Date toConvert = inFormat.parse(date);
    date = inFormat.format(toConvert);
    return new StringBuffer(date).insert(date.length()-2, ":").toString();

【讨论】:

以上是关于如何在android APP中设置系统语言的主要内容,如果未能解决你的问题,请参考以下文章

Android 中设置指定语言

Android 中设置指定语言

iOS:如何检索特定语言环境的语言环境字符串而不是用户在操作系统中设置的字符串?

在设备中设置系统区域设置

如何在ResourceBundleMessageSource中设置默认语言环境?

如何在android中设置移动系统时间和日期?