2015-05-05 6 views
0

В моем приложении для Android я хочу динамически менять язык по умолчанию. Я реализовал этот метод: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); 
} 
+0

Привет, Джулия, мне было интересно, откуда появился код в функции setLocale? Является ли это автоматически сгенерированным шаблоном? Или это происходит из руководства/учебника Android или чего-то еще? –

 Смежные вопросы

  • Нет связанных вопросов^_^