2015-05-05 143 views
0

在我的Android应用程序中,我想要改变默认语言dinamically。我已经实现这个方法:Android - 动态更改语言

public void changeLanguage(String lang) { //lang="it" or "en" for example 
    myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) 
      { 
       finish(); 
       startActivity(getIntent()); 
      } else recreate(); 
     } 
    }, 1); 
} 

,并在清单中我加入到我的MainActivity这一行:

android:configChanges="locale|orientation" 

我也试过这样:

android:configChanges="locale|layoutDirection" 

这个解决方案运作良好,但只要屏幕旋转回到默认配置并恢复语言。

我该如何解决此问题?

+0

可能重复(http://stackoverflow.com/questions/2264874/changing-locale-within-the-app-itself) – Lamorak

+0

我已经尝试过他们在那篇文章中提供的解决方案,正如我上面所说的那样,它不起作用。 –

回答

1

您可以在回调onSaveInstanceState中保存您的语言配置,当系统由于旋转而重新创建活动时,请重新加载保存的区域设置值。

private static final String LANG = "lang"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (savedInstanceState != null) { 
     Configuration configuration = getResources().getConfiguration(); 
     DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); 
     configuration.locale = new Locale(savedInstanceState.getString(LANG)); 
     getResources().updateConfiguration(configuration, displayMetrics); 
    } 
} 

/* 
* (non-Javadoc) 
* 
* @see 
* android.support.v4.app.FragmentActivity#onSaveInstanceState(android.os 
* .Bundle) 
*/ 
@Override 
protected void onSaveInstanceState(Bundle outState) { 
    // TODO Auto-generated method stub 
    super.onSaveInstanceState(outState); 

    outState.putString(LANG, "it"); 
} 
0

您是否尝试在首选项中存储您的语言环境?例如:

protected void onCreate(Bundle savedInstanceState) { 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    setLocale(prefs.getString("pref_locale", "en")); 
} 

public void changeLanguage(String lang) { 
    prefs.setString("pref_locale", lang); 
    setLocale(lang); 
} 

public void setLocale(String language_code) { 
    Resources res = getResources(); 
    // Change locale settings in the app. 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    android.content.res.Configuration conf = res.getConfiguration(); 
    conf.locale = new Locale(language_code.toLowerCase()); 
    res.updateConfiguration(conf, dm); 
} 
[应用程序本身内改变的Locale]的
+0

嗨,朱莉娅,我想知道,'setLocale'函数中的代码来自哪里?这是自动生成的样板吗?或者它来自Android指南/教程或其他内容? –