更改设备的语言设置(区域设置)

22

我知道可以通过res/string和Locale来在一个应用程序中使用多种语言。 这里有一个例子: (ANDROID) 控制用户语言

现在我该如何在手机上更改语言? 像这样操作: 菜单 > 设置 > 语言和输入法 > 选择语言

有没有一些真正的代码可以访问这些设置? 还是我应该为语言设置创建一个快捷方式的意图。 请发布一些代码。

编辑: 使用Locale类 developer.android.com/intl/fr/reference/java/util/Locale.html

构造函数至少是Locale(String language) 输入是语言。 如何检索设备上使用的当前语言?

5个回答

49

我不确定是否可以直接从应用程序中进行设置,但如果你想让用户自己前往更改,请尝试以下方法:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("com.android.settings", "com.android.settings.LanguageSettings");            
startActivity(intent);

嘿,吉姆, 非常感谢。 还有一个问题,你是怎么知道设置的包名和类名的? - Raymond Chenon
9
我所做的是在连接到电脑上的USB时使用电话,并查看logcat输出。每个启动的Intent都记录在输出中。其中一行读取为:I / ActivityManager(1018):Starting activity:Intent {act = android.intent.action.MAIN cmp = com.android.settings / .LanguageSettings}。我有一个直觉,于是我去了Google Code搜索并搜索了“LanguageSettings Android Intent”,找到了有人做这件事的示例。我自己测试了一下,并将代码简化为此处的代码片段。 - Jim Blackler
我找到了另一个答案解决了我的问题。有一个开源代码项目 http://code.google.com/p/languagepickerwidget/ 它重新创建了一个ListActivity来显示和选择语言。Jim,你的解决方案非常简单,正是我所需的。 这是一个快捷方式到设置。 在你发布之后不久,我在市场上上传了一个名为“raygional”的应用程序。 如果可以的话(我只有6个点),我会让你的回答变得有用。还有另一种查看进程和意图的方法。 在模拟器中转到菜单> Dev Tools> Development Settings>并单击“显示运行的进程”。 - Raymond Chenon
5
"startActivity(new Intent(Settings.ACTION_LOCALE_SETTINGS))" 可能更适用于某些使用情况,因为它直接打开语言列表,而且这是一个官方定义的操作。 - Markus Junginger

14

有另一种方式打开系统设置以更改语言:

Intent i = new Intent( android.provider.Settings.ACTION_LOCALE_SETTINGS );
startActivity( i );

它只显示语言列表,当您选择一种语言时 - 它会更改设备上的语言。

1
这种方法的缺点是,如果用户按顶部左侧带有“<”标志的图标,则返回到“语言和输入”屏幕。 - CJBS
@CJBS 真的!有没有处理这种状态的方法?你找到了什么吗? - Deepika
@Deepika 我没有 :-( - CJBS

7
我找到了另一个解决方案来回答我的问题。有一个开源代码项目code.google.com/p/languagepickerwidget,重新创建了一个ListActivity来显示和选择语言。
Jim,你的解决方案非常简单,正是我需要的。这是一个快捷方式到设置。在你发布之后,我上传了一个名为“raygional”的应用程序到市场。如果我可以(我只有6分),我会让你的答案更有用。
还有一种方法可以查看进程和意图。在模拟器上,转到菜单> Dev工具>开发设置>并单击“显示运行中的进程”。

是否有其他类似于这个项目的作品,能够展示如何仅更改操作系统的区域设置,但使用 Apache 许可证或类似许可证? - android developer

3
如果您将意图更改为以下内容,进一步解释Jim的答案:

如果您将意图更改为以下内容:

intent.setClassName("com.android.settings", "com.android.settings.LocalePicker"); 

它将直接将用户放在语言选择列表中,一旦选择了语言,它将返回到您的应用程序。它省去了点击的步骤,不需要让用户考虑选择三个选项(语言、词典和键盘),并且在选择后立即返回到您的应用程序。

在三星Galaxy Tab 2上无法运行(导致ActivityNotFoundException:无法找到显式活动类)。也许有可用的更新意图吗? - Jane
我在代码中使用了try catch语句,如果出现异常则会回退到另一个try catch语句,并使用ACTION_LOCALE_SETTINGS意图。效果非常好! - baskInEminence

3
据我所知,改变设备的区域设置而不使用意图(即其他解决方案提出的方法)的唯一方法是通过反射访问内部类(这涉及到风险)。
您可以在此用例中找到一个精确的示例

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接