2013-03-14 2 views
4

Я внедрил пользовательский выбор локали около года назад, но после выхода версии 4.1 пользователи начинают жаловаться на постоянную мигание активности. Вот код, я использую (составитель из различных SO ответов):Активность мигает после изменения локали в Android 4.1+

public final class TestApplication extends Application 
{ 
    private Locale desiredLocale = new Locale("ru-RU"); 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     updateLocale(new Configuration()); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) 
    { 
     super.onConfigurationChanged(newConfig); 
     updateLocale(newConfig); 
    } 

    private void updateLocale(Configuration newConfig) { 
     newConfig.locale = desiredLocale; 
     Locale.setDefault(desiredLocale); 
     getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());   
    }  
} 

Приложение содержит только один пустой деятельности, которая воссоздается на Android каждый второй после того как я изменить ориентацию устройства. Here является источником выборки.

Похоже, что все приложения, использующие эту технику, стали недействительными. Каков правильный подход?

ответ

3

Эта линия вызвала решение на провал:

getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics()); 

Правильная реализация (по крайней мере, она работает) определяется здесь https://stackoverflow.com/a/14010044/554336:

Configuration config = new Configuration(); 
config.locale = locale; 
getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 

Так новый экземпляр конфигурации должен быть создан каждый раз.