2011-01-11 2 views
36

Я пытаюсь получить выбранную пользователем тему и чувствую, что я расстраиваюсь. Определение темы в AndroidManifest.xml работает как надо, но (насколько я могу сказать) не могут изменяться в зависимости от приложения предпочтений:Программно переключение прикладной темы?

<application 
    android:theme="@style/theme_sunshine" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name"> 

В качестве альтернативы, установив его динамически в каждой деятельности также работает:

someChosenTheme = PreferenceManager.getDefaultSharedPreferences(this).getString("themePreference", "theme_twilight"); 
setTheme(someOtherChosenTheme); 

Но это кажется грязным, и я предпочел бы установить тему для всего приложения в одном месте. Моя первая мысль была, чтобы захватить контекст приложения, как только мои основные запуски деятельности и сделать это там:

getApplicationContext().setTheme(R.style.theme_dummy); 

Насколько я могу сказать, this должен сделать трюк, но на самом деле это ничего не делает - у всего приложения есть стиль Android по умолчанию. Является ли это выше, и если да, могу ли я сделать что-то еще глупое?

Я работаю над уровнем API 3, если это имеет значение. Добродетели в правильном направлении высоко оценили!

Related question.

ответ

30

Создайте базовую активность для своего приложения и переопределите onCreate, чтобы установить тему. Выведите все ваши другие действия из этой базы.

Также проверьте этот учебник: http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

+0

Это, по существу, то, что я делаю. Это все еще не идеально, так как нет множественного наследования, например. для пользовательской ListActivity, но неудобства незначительны. Очень полезный учебник, хотя я его уже прочитал :) – Cheezmeister

+0

У меня acutally есть BaseListActivity и Base (Generic) Activity в каждом приложении, которое я делаю. BaseListActivity имеет общую обработку CRUD (чтение, добавление, редактирование, удаление), поэтому очень просто создать новую активность списка и просто переопределить несколько методов. Конечно, если я добавлю MapActivity или TabActivity, мне также нужно будет создать BaseXActivity для них. Иногда многократное наследование просто лучше :) – peter3

+5

Так что добавление setTheme для каждой активности, до того, как вызывается «setContentView», действительно является правильным решением? нет ли единого системного решения? также, что происходит со всеми действиями, которые уже живы? –

5

Там может быть хорошим решением этой проблемы, но я не мог найти, так что я в конечном итоге сделать небольшой статический вспомогательный метод в вспомогательный класс, который принимает активность и в основном выполняет эти две строки вы написали. Конечно, это не идеально, но просто добавление одной короткой строки кода к каждому методу onCreate() в моем приложении было терпимым.

Смежные вопросы