2015-03-17 3 views
1

У меня есть основное действие (назовем его A) и второе действие (назовем его B), которое используется для изменения языка приложения. Дело в том, что когда я нажимаю кнопку, чтобы изменить язык, я также вызываю recreate();, а B меняет его язык. Пока все в порядке. Проблема возникает, когда я возвращаюсь к основному виду деятельности (A), и он не обновил язык, потому что он не был воссоздан, поэтому есть ли способ воссоздать A из B, чтобы обновить A?Как воссоздать предыдущую активность?

Я использую этот код, чтобы перевести (пример анг версии) приложение:

public void btnIngles_onClick(View v) 
{ 
    Locale locale = new Locale("en"); 
    Locale.setDefault(locale); 

    Configuration config = new Configuration(); 
    config.locale = locale; 
    this.getApplicationContext().getResources().updateConfiguration(config, null); 
    recreate(); 
} 
+1

попробуйте посмотреть на Намерения и startActivityForResult и передать обновленный язык обратно в результате – chaitanya

ответ

3

1) Activity B изменяет некоторые глобальные настройки, доступные через SharedPreferences, например

2) В Activity A сделать:

@Override 
protected void onResume() { 
    super.onResume(); 
    if(didLanguageChange) 
     recreate(); 
} 

Проблема решена. Activity Aбудет позвонить onResume(), так как он переключился в состояние паузы, когда на передний план вышло Activity B.

+0

я сделал это, и это требует ' воссоздать() метод 'но язык активность не меняется .. :( ' защищен недействительным onResume() { super.onResume();. если (idioma.compareTo (Locale.getDefault() GetLanguage())! = 0) this.recreate(); } ' Я проверил, что условие re становится истинным, а язык изменен, но, как я уже сказал, A не меняет своего языка. – Drumnbass

+0

@Drumnbass, как вы устанавливаете свои тексты? Вы используете локализованные строки? – Droidman

+0

Да, на самом деле, все приложение переводится (даже контекстные меню на A). Единственное, что не обновляется, это A, даже воссоздавая его, я не знаю, что сказать, это любопытное, но это также смешно. XD – Drumnbass

1

Перезапустите приложение:

startActivity(new Intent(this, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent 
       .FLAG_ACTIVITY_CLEAR_TOP)); 
1

Вы должны реализовать onActivityResult() в вашей деятельности. Этот link имеет дополнительную информацию и должен быть вам очень полезен. В двух словах:

Внутри вашей деятельности A, вам необходимо создать переменную, используемую в качестве кода запроса, что-то вроде этого:

private static final int ACTIVITY_B_REQUEST = 0; 

И затем, в вашей баттона OnClick слушателем, вы будете начать свою деятельность с помощью намерения и функции startActivityForResult():

Intent myIntent = new Intent(ActivityA.this, ActivityB.class); 
startActivityForResult(myIntent, ACTIVITY_B_REQUEST); 

Начнётся активность B для вас. Всякий раз, когда заканчивается операция B, вызывается onActivityResult. Вы можете изменить его и выполнить его в зависимости от того, как вы нужны, но это может выглядеть примерно так:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == ACTIVITY_B_REQUEST && resultCode == RESULT_OKAY){ 
     // Handle this by doing what you need to refresh activity A. 
    } else{ 
     super(requestCode, resultCode, data); 
    } 
} 
+0

IMHO, разве это не переполнение, чтобы запустить «Активность» для получения результата, чтобы проверить, не изменилось ли оно? – Droidman

+0

@Droidman Вы правы, это может быть излишним. Если им не нужна информация из новой деятельности, например, на каком языке она должна быть изменена? Это просто показалось мне подходящим подходом, потому что они хотели использовать ActivityA для обработки того, что происходит, когда ActivityB заканчивается. – AdamMc331

+0

ну, я получаю вашу мысль, хотя я бы предпочел добавить какую-то проверку в 'OnResume()'. Возможно, это только мой личный подход, так как я всегда реализую вспомогательные классы, которые отслеживают изменения важных параметров и уведомляют всех подписчиков, которые интересуются этими изменениями;) – Droidman