如何在纵向和横向模式下本地更改语言

时间:2014-01-21 00:48:05

标签: android multilingual landscape-portrait

我必须实现一个应用程序原型,应该可以更改应用程序内的语言。 我的代码:

...builder.setItems(langList, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            selectedLanguage = which;
            if (selectedLanguage != -1) {
                Configuration configuration = new Configuration(getResources().getConfiguration());
                String currentLanguage = configuration.locale.getLanguage();
                switch (selectedLanguage) {
                case 0:
                    if (currentLanguage.equalsIgnoreCase("de")) {
                        configuration.locale = Locale.ENGLISH;
                    } else {
                        return;
                    }
                    break;
                case 1:
                    if (currentLanguage.equalsIgnoreCase("en")) {
                        configuration.locale = Locale.GERMAN;
                    } else {
                        return;
                    }
                    break;

                default:
                    break;
                }
                getResources().updateConfiguration(configuration, null);
                Intent intent = new Intent(getActivity(), DashboardActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            }
            dialog.dismiss();
        }...

它很好用。但问题是 - 当您更改显示模式(纵向< =>横向)时,再次加载当前系统语言(分别在 values 文件夹中 strings.xml )。 有没有人经历过它,或者可能是一个建议我怎么能解决这个问题呢?

提前感谢..

3 个答案:

答案 0 :(得分:0)

您可以在用户选择其语言时将其保存在首选项中,并在oncreate方法中检查首选项是否具有语言值,如果不加载默认语言

默认情况下,更改方向将调用oncreate方法,因此可以随意添加检查代码

答案 1 :(得分:0)

由于onConfigurationChanged()生命周期事件发生,您可以在发生方向更改时发现问题。

有关如何检测方向更改的信息,请参阅以下示例。 http://techblogon.com/android-screen-orientation-change-rotation-example/

配置更改后,您可以存储所需的任何值。请注意,您还可以在首次设置时将值存储在设置中。

创建活动时(onCreate()),您可以阅读方向并设置任何适当的值。

总之,请查看活动生命周期,您可以触发相关事件。

答案 2 :(得分:0)

所以,我使用 SharedPreferences

解决了这个问题
... default:
                    break;
                }
                SharedPreferences preferences = getActivity().getSharedPreferences("SETTINGS_FILE", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = preferences.edit();
                editor.putString("currentLanguage", configuration.locale.getLanguage());
                editor.commit();

                getResources().updateConfiguration(configuration, null); ...

然后我在MainActivity / MainFragment中实现了方法 setCurrentLanguage()

... protected void setCurrentLanguage() {
    Configuration configuration = new Configuration(getResources().getConfiguration());
    SharedPreferences preferences = getSharedPreferences("SETTINGS_FILE", Context.MODE_PRIVATE);
    String restoredLanguage = preferences.getString("currentLanguage", null);
    if (restoredLanguage.equalsIgnoreCase("en")) {
        configuration.locale = Locale.ENGLISH;
        getResources().updateConfiguration(configuration, null);
    }
} ...

并且我在 setContentView(...)之前在每个活动/片段中调用此方法:

// in an activity
... protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setCurrentLanguage();
    setContentView(R.layout.activity_dashboard); ...
// or in a fragment
... public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    setCurrentLanguage();
    View rootView = inflater.inflate(R.layout.fragment_preferences,
            container, false); ...

再次感谢您的帮助;)