1

我对android dev很陌生,我有一点本地化问题。我有一个应用程序,用户可以在其中选择使用除设备当前语言之外的其他默认语言。例如,居住在德国并将手机设置为“德语”的法国用户可能希望以法语使用我的应用程序(出于各种原因),但不想将手机的默认语言设置为法语。

我的应用程序只有一个活动,我在其中加载和卸载一些视图。这是一个非常简单的应用程序,但内容很大(文本和图像)。

为此,我使用下面的代码。

它运作良好,但存在一些问题:

  • 当用户使用适当的按钮选择新语言并重新启动应用程序时(或者如果我强制应用程序完成()...):只有第一个视图使用新语言。下一个视图仍设置为以前的语言。

  • 如果用户选择关闭他的设备,同样的问题:只有活动的第一个视图设置为选择的语言(从首选项中读取变量。)。

  • 但是,如果用户第二次选择重新启动应用程序,所有视图和子视图都会正确设置为新语言。

  • 而且,如果用户之前至少重新启动了一次应用程序,则每次语言更改都会成功完成。无需再次重新启动应用程序。

那么,有没有办法正确设置新语言

  • 应用程序首次重新启动后立即

  • 如果用户之前已经关闭并打开了他的设备

任何帮助将不胜感激。这是我使用的代码(简化):

public void onCreate(Bundle savedInstanceState) {
    SharedPreferences myPrefs;
    myPrefs = getSharedPreferences("langage", MODE_PRIVATE);  
    String langageToLoad = myPrefs.getString("langageToLoad", "");
    changeLangage(langageToLoad);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     (...some other code...)
    }

public void setLangageEn(View view){
    changeLangage( "en");
    setPreference( "en"); 
    // finish(); // optionnal
    }

public void changeLangage(String langage) {
    Locale locale = new Locale(langage); 
    Locale systemLocale = Locale.getDefault();
    if (systemLocale != null && systemLocale.equals(locale)) {
    return;
    }
    Locale.setDefault(locale);
    android.content.res.Configuration config = new android.content.res.Configuration();
    config.locale = locale;
    getResources().updateConfiguration(config, getResources().getDisplayMetrics());
    }

public void setPreference( String langage){
    SharedPreferences languagepref = getSharedPreferences("langage",MODE_PRIVATE);
    SharedPreferences.Editor editor = languagepref.edit();
    editor.putString("langageToLoad",langage );
    editor.commit();
    }
4

1 回答 1

0

Following thing: just because you finish() one activity, the previous activities don't need to be closed and therefor MIGHT call onResume() and just "jump over" onCreate(), they aren't out of the memory yet and don't call onCreate() (which comes before onResume()), where you implement your language check.


One thing to avoid this issue, might be to create a custom "Application class" (extends Application) and there, check the localize-preference and set it to a field with getter and setter methods. To get the application instance then (which is created on the application start!(not when just starting a second activity..) you can do ((CustomApp)Context.getApplicationContext).getCustomLocalization() in your activities..

However. To really load up the new language settings in every activity, be sure to check it in onResume() and set the language 1. to the field in CustomApp and 2. to the preference (maybe with the same setter method?) when changing it. Then finish() your settings activity and recreate it to load the new settings.

于 2013-03-07T08:40:06.633 回答