android如何正确设置应用程序的默认语言,即使关闭设备后

时间:2012-10-16 14:21:24

标签: android localization locale android-preferences

我对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();
    }

1 个答案:

答案 0 :(得分:0)

关注事物:仅仅因为你完成()一项活动,之前的活动不需要关闭,因此可以调用onResume()并只是“跳过”onCreate(),他们还没有忘记内存并且不调用onCreate()(在onResume()之前),在那里实现语言检查。


要避免此问题,可能是创建自定义“应用程序类”(扩展应用程序),然后检查localize-preference并使用getter和setter方法将其设置为字段。然后获取应用程序实例(在应用程序启动时创建!(而不是刚开始第二个活动时)。您可以在活动中执行((CustomApp)Context.getApplicationContext).getCustomLocalization()..

然而。要真正加载每个活动中的新语言设置,请确保在onResume()中检查它并将语言1.设置为CustomApp中的字段,并将2.更改为首选项(可能使用相同的setter方法?) 。然后完成()您的设置活动并重新创建它以加载新设置。