在Android首选项中设置应用程序语言

8
我希望应用程序的语言能够根据用户的偏好设置进行设置,但到目前为止它并不像我想要的那样工作。
我已经设置了默认值:strings.xml和values-es,其中包含一个西班牙语的strings.xml。我有一个菜单选项,可以将用户带到首选项活动页面,在那里他可以选择语言等其他内容。
因此,以下是一些代码片段:
public class Preference extends PreferenceActivity implements
        OnSharedPreferenceChangeListener {
......
// Set up a listener whenever a key changes 
        getPreferenceScreen().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(this);


...}
//(......)

//and here I have the listener so when the language pref changes value the locale gets changed.
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        if (key.equals("listPref2")) {
            String idioma = sharedPreferences.getString("listPref2", "catala");
            if ("castella".equals(idioma)) {
                idioma = "es_ES";

                Locale locale = new Locale(idioma);
                Locale.setDefault(locale);
                Configuration config = new Configuration();
                config.locale = locale;
                getApplicationContext().getResources().updateConfiguration(config,
                        getBaseContext().getResources().getDisplayMetrics());
            }
        }
    }

当我更改语言时它可以工作,但是当我稍后回来或重新启动模拟器时,语言会回到默认的位置en_US,并且应用程序语言又被改回默认值。我该怎么解决这个问题?
我知道我可以获得此首选项(我可以从所有活动中访问它),然后每次设置区域设置,但我觉得有点麻烦,难道没有更加优雅的方法吗?
我想要做的是,如果用户设置了语言,则当他两天后回来时,无需再次更改语言。
有什么想法?
2个回答

11

好的,这可能对某些人有所帮助。我已经在主活动清单中添加了以下内容:

android:configChanges="locale"

然后,当用户选择首选项时,我放置了一个确认按钮,然后该按钮将带您返回到主活动,这就是为什么语言设置会被重置的原因。

我有一个静态类,其中包含更改语言环境的代码:

public static void updateLanguage(Context context, String idioma) {
    if (!"".equals(idioma)) {
        if ("castella".equals(idioma)) {
            idioma = "es_ES";
        } else if ("catala".equals(idioma)) {
            idioma = "ca_ES";
        }
        Locale locale = new Locale(idioma);
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        context.getResources().updateConfiguration(config, null);
    }
}

在我所有活动结束前,我有大约20个活动。我在每个活动中都调用这个方法:

setContentView(R.layout.list_event);

使用这些方法时,当我旋转屏幕时,活动不会更改语言。 以下是一篇博客链接,帮助了我: http://adrianvintu.com/blogengine/post/Force-Locale-on-Android.aspx


1
我觉得你需要在 MainActivity 的 onCreate 方法中设置区域设置,就像你在 onSharedPreferenceChanged 方法中设置它一样。

1
我已经按照你说的做了,但这只在主活动中更改了语言环境。那我就在所有活动的开头添加相同的代码。谢谢。 - vallllll
我必须承认我从未尝试过本地化。看起来它是基于用户设置的。你看过这个吗?http://developer.android.com/resources/tutorials/localization/index.html - bytebender
是的,我已经设置了默认语言和两种语言:西班牙语和加泰罗尼亚语,我需要用户能够自己选择所在地区。仅通过手机确定所在地区是不够的。 - vallllll

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