2013-04-18 4 views
2

Мне нужно изменить язык во время выполнения на Android (да, я знаю, что это нехорошее поведение, но это требование ...).Изменить язык во время выполнения в Android

Итак, у меня есть базовый класс, из которого распространяется каждый вид деятельности. Этот класс имеет следующие функции:

public static void changeLanguage(Context context) { 
    Resources res = context.getResources(); 
    /* 
    * Change locale settings in the app. 
    */ 
    DisplayMetrics dm = res.getDisplayMetrics(); 

    /* 
    * Store and load data in this preferences 
    */ 
    android.content.res.Configuration conf = res.getConfiguration(); 
    String[] localArray = res.getStringArray(R.array.language_short_array); 
    if (localArray != null) { 
     SharedPreferences settings = context.getSharedPreferences(
       MyService.APP_ID, MODE_PRIVATE); 
     conf.locale = new Locale(localArray[settings.getInt(
       PREFERED_LANGUAGE_KEY, 0)]); 
     res.updateConfiguration(conf, dm); 
    } 
} 

Я буду называть этот метод OnCreate:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    changeLanguage(this); 
} 

Это в супер-класса. Моя деятельность простирается от него и сначала вызывает super.onCreate. После этого вызова они устанавливают свой макет и инициализируют свои настройки ...

Я думал, что мои строки кода сделают это. Но у меня есть следующая проблема: иногда активность меняет язык, а иногда нет!

Если я установил на нем точку останова отладки и после того, как программные паузы я нажимаю, все работает нормально. Поэтому я думаю, что в некоторых случаях, когда мое приложение «достаточно медленно», язык будет меняться правильно, тогда как язык не изменится, если приложение слишком быстро ...

Есть ли какие-либо решения моей проблемы ? Как я могу быть уверен, что мой язык изменится правильно в любое время?

Большое спасибо!

Edit: Вот пример для класса, который простирается от моего суперкласса

public class MainMenuActivity extends BaseActivity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_start); 
    } 
} 

ответ

3

changeLanguage(this); нужно только вызывать, когда язык был изменен или когда приложение загружено. res.updateConfiguration(conf, dm); обновляет глобальную конфигурацию и специфичен для вашего экземпляра приложения, а не вашего экземпляра активности.

При изменении locale в Activity необходимо восстановить этот номер Activity, чтобы увидеть изменение вашего языка. Это можно легко сделать, заставляя изменение ориентации, то заставляя его назад, как это:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 

Если вы попали назад после смены языка вы увидите старый язык, потому что onCreate не называется. Вам нужно будет обнаружить в onResume, что язык изменился и заставит воссоздать Activity.

- = EDIT = -

Использование ориентации экрана, чтобы перезагрузить Activity, оказалось немного глючит на некоторых устройствах. Я сейчас использую это для перезагрузки тока Activity:

public static void resetScreen(Activity activity) { 
    if (activity != null) { 
     if (Build.VERSION.SDK_INT >= 11) { 
      activity.recreate(); 
     } else { 
      Intent intent = activity.getIntent(); 
      activity.overridePendingTransition(0, 0); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
      activity.finish(); 

      activity.overridePendingTransition(0, 0); 
      activity.startActivity(intent); 
     } 
    } 
} 
0

Я думаю, что нужно опубликовать пример деятельности, который расширяет свой суперкласс. Вызов changeLanguage in onCreate() кажется мне подозрительным. Это произойдет только при первом инициализации приложения. Чтобы изменить язык после загрузки приложения, вам придется остановить его и заново создать.

+0

Эй. Я добавил пример. Его просто вызвать onCreate и установить контент-представление. Иногда это работает, иногда это не так. Когда я устанавливаю точку останова в setContentView и продолжаю, она будет работать определенно – Frame91

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