Обновить (воссоздать) действия в заднем стеке при изменении языкового стандарта во время выполнения

У меня есть действие: ActivityMain из этого действия я перешел к другому действию под названием ActivitySettings, а в действии настроек я меняю языковой стандарт приложения, нажимая кнопку, и, используя воссоздать, я добился изменения, которое мне нужно в текущем действии, но когда я нажимаю назад мой ActivityMain возобновит работу, но языковой стандарт не обновлен.

Может ли кто-нибудь сказать мне, как «воссоздать» бэкстек-действия? какой будет правильный подход.

Я не могу вызвать воссоздание при обновлении, так как это будет бесконечный цикл


person Praneeth    schedule 29.06.2018    source источник
comment
Посмотрите здесь developer.android.com/training/basics/intents/result   -  person VolkanSahin45    schedule 29.06.2018


Ответы (1)


В каждом onCreate() Activity вы можете поддерживать currentLangCode. Отметьте это значение в onResume(), если оно отличается, вы можете сделать вывод, что языковой стандарт был изменен и recreate()

Сделать это можно следующим образом:

public class ActivityA extends AppCompatActivity{
    private String currentLangCode;
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        currentLangCode = getResources().getConfiguration().locale.getLanguage();
        ...
    }
    @Override
    public void onResume(){
        ...
        if(!currentLangCode.equals(getResources().getConfiguration().locale.getLanguage())){
            currentLangCode = getResources().getConfiguration().locale.getLanguage();
            recreate();
        }
    }
    ...
}

Моя рекомендация

Если вы хотите применить его ко всем Activity, просто создайте BaseActivity следующим образом:

public class BaseActivity extends AppCompatActivity{
    private String currentLangCode;
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        currentLangCode = getResources().getConfiguration().locale.getLanguage();
        ...
    }
    @Override
    public void onResume(){
        ...
        if(!currentLangCode.equals(getResources().getConfiguration().locale.getLanguage();)){
            currentLangCode = getResources().getConfiguration().locale.getLanguage();
            recreate();
        }
    }
    ...
}

Расширить все действия с BaseActivity

public class ActivityA extends BaseActivity{

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
    }
    @Override
    public void onResume(){
      super.onResume();
    }
    ...
}
person Sagar    schedule 29.06.2018
comment
Конечно. Дай мне знать. - person Sagar; 29.06.2018
comment
getResources (). getConfiguration (). locale.getLanguage () это не дает измененного языка, он все еще дает мне старый язык, и условие всегда flase Я сделал работу, проверив с shareprefs, где я сохраняю измененный язык - person Praneeth; 29.06.2018
comment
@Praneeth, только что проверил значение и вернул мне правильное значение. - person Sagar; 29.06.2018
comment
@Praneeth, то же самое для меня - person ghita; 23.06.2019