Изменение темы активности singleTop

Итак, у меня есть активность в моем приложении, которая в настоящее время помечена как

android:launchMode="singleTop"

... и в настоящее время у меня есть логика как в onCreate, так и в onNewIntent, чтобы убедиться, что на экране всегда отображаются данные, доставленные самым новым запущенным Intent. И я хотел бы иметь возможность переключаться между Holo.Light и Holo.Dark на основе данных, предоставленных этим намерением.

Вызов setTheme не работает (см. эти две ссылки):

Эта вторая ссылка имеет обходной путь, который включает создание второй записи AndroidManifest.xml с другой темой и указанием на пустой подкласс рассматриваемого действия. Это работает, но нарушает singleTop (поскольку теперь в стеке может быть два экземпляра действия).

У меня нет идей. Кто-нибудь знает, есть ли какой-либо способ сделать это, кроме создания моего собственного пользовательского представления ActionBar для этого действия?


person Eric    schedule 12.03.2012    source источник


Ответы (3)


Вам нужно установить тему с помощью метода setTheme(), но затем перезагрузить активность.

У меня есть действие singleTask и код, работающий на API‹11, поэтому у меня есть этот код для перезагрузки действия:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();

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

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

person Udinic    schedule 13.03.2012
comment
Для всех, кто пытается это сделать, мне пришлось изменить строку 3 метода на намерение.setFlags. У рассматриваемого намерения был установлен флаг Intent.FLAG_ACTIVITY_REORDER_TO_FRONT, и это приводило к сбою перезапуска. - person Eric; 14.03.2012

Поскольку вы имеете в виду темы Holo, я предполагаю, что вы работаете с API 11+.

В API 11 добавлен метод Activity#recreate(), который отправляет ваша текущая деятельность через тот же процесс разрыва/воссоздания, который обычно происходит для изменений конфигурации, таких как поворот экрана между альбомной и портретной ориентацией. Ваш метод onCreate будет снова вызываться для нового экземпляра Activity, что позволит вам установить тему в Activity до того, как окно будет инициализировано, как обычно.

Приложения Google Книги используют эту тактику для переключения между светлой и темной темами для «ночного режима».

person adamp    schedule 12.03.2012
comment
Извините, тег actionbarsherlock должен был указывать, что мне нужно, чтобы это работало не только над последними и лучшими версиями. - person Eric; 13.03.2012
comment
да, но вы все еще можете поддерживать более старую версию ОС с помощью метода, который завершает и запускает новое действие и использует этот (при условии, что это лучше просто потому, что это часть API) на устройствах, которые его поддерживают. - person Mario Lenci; 19.09.2012

Я опубликую свое решение, которое на самом деле не добавляет здесь ничего нового, но объединяет различные советы.

После изменения темы активности и, возможно, (зависит от того, что вы ищете) приложения:

public void updateTheme( Activity a, int themeID ) {
    a.getApplication().setTheme( themeID );
    a.setTheme( themeID );
}

Затем вам нужно воссоздать активность (так же, как после изменения конфигурации). Для ОС 11> есть API, вместо этого для предыдущих версий вам нужно принудительно завершить и перезапустить действие так же, как Udinic указал.

public boolean isBeforeHoneycomb() {
    return Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB;
}

public void reload() {
    if( isBeforeHoneycomb() ) {
        Intent intent = getIntent();
        overridePendingTransition(0, 0);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        finish();

        overridePendingTransition(0, 0);
        startActivity(intent);
    }else{
        recreate();
    }
}
person Mario Lenci    schedule 19.09.2012