Воссоздать бэкстек в Android

Я только что реализовал способ изменить тему в своем приложении. Нажатие кнопки устанавливает значение в SharedPreferences, затем действие воссоздается, и тема изменяется из-за флага.

Проблема в том, как справиться с backstack. Простое воссоздание действия не является хорошим, потому что нажатие аппаратной кнопки назад возобновит предыдущее действие (со старой установленной темой), тогда как если пользователь сделал следующее:

Начните с Задания A > B > C > Нажмите кнопку смены темы> Нажмите кнопку аппаратного возврата

Затем я хочу, чтобы они вернулись в Занятие B с правильно примененной новой темой. Лучшее решение, которое я нашел, - это воссоздать backstack на основе иерархии объектов следующим образом:

    Intent intent = new Intent();
    intent.setClass(activity, activity.getClass());
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(activity);
    stackBuilder.addNextIntentWithParentStack(intent);
    stackBuilder.startActivities(new Bundle());

Однако иерархия Activity в нашем приложении не очень четко определена (т. Е. C может иметь несколько родителей), поэтому приведенный выше код может привести к тому, что пользователь вернется к неожиданному действию после нажатия кнопки назад.

Есть ли чистый способ перестроить бэк-стек на основе фактического бэк-стека, а не иерархии действий?

0 ответов

Одно из решений, которое я использую сейчас, которое не идеально, но позволяет избежать внесения каких-либо изменений в backstack, - это использовать метод onResume().

В onResume() для всех действий themeKey проверяется на наличие изменений. Если отличается, то действие воссоздается. Мой onCreate() устанавливает тему, поэтому при воссоздании применяется новая тема. Это означает, что по мере того, как пользователь перемещается по backstack, если тема была изменена, она обновится.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SharedPreferences sharedPreferences = getSharedPreferences("ThemePref", Context.MODE_PRIVATE);
    themeKey = sharedPreferences.getInt("themeKey",R.style.GM1);
    getTheme().applyStyle(themeKey,true);
    setContentView(R.layout.activity_settings);
}

@Override
protected void onResume() {
    super.onResume();
    SharedPreferences sharedPreferences = getSharedPreferences("ThemePref", Context.MODE_PRIVATE);
    int newThemeKey = sharedPreferences.getInt("themeKey",R.style.GM1);
    if (newThemeKey != themeKey){
        recreate();
    }
}

На 5 лет поздно, но, надеюсь, это кому-то поможет!

Другие вопросы по тегам