Смена темы одиночной игры - PullRequest
5 голосов
/ 13 марта 2012

Итак, в моем приложении есть активность, которая в данный момент помечена как

android:launchMode="singleTop"

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

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

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

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

Ответы [ 3 ]

1 голос
/ 13 марта 2012

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

У меня есть однозадачное действие и код, который работает на API <11, поэтому у меня есть этот кодчтобы перезагрузить упражнение: </p>

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

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

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

1 голос
/ 13 марта 2012

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

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

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

0 голосов
/ 19 сентября 2012

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

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

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

Затем вам необходимо заново создать действие (как после изменения конфигурации).Для OS 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();
    }
}
...