2011-01-11 18 views
36

Estoy tratando de obtener un tema elegido por el usuario y siento que estoy frustrantemente cerca. Definir el tema en AndroidManifest.xml funciona como debería, pero (lo mejor que puedo decir) no se puede cambiar en función de las preferencias de aplicaciones:¿Cambia el tema de la aplicación programáticamente?

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

Alternativamente, la configuración de forma dinámica en cada actividad también funciona:

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

Pero eso parece complicado, y prefiero configurar el tema para toda la aplicación en un solo lugar. Mi primer pensamiento fue para agarrar el contexto de aplicación tan pronto como mis principales lanzamientos de actividad y hacerlo allí:

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

Como mejor que puedo decir, this debe hacer el truco, pero en realidad no lo está haciendo nada - la toda la aplicación tiene el estilo predeterminado de Android. ¿Es válido lo anterior, y si es así, podría estar haciendo otra cosa tonta?

Estoy trabajando en API nivel 3 si eso es importante. ¡Prods en la dirección correcta muy apreciados!

Related question.

Respuesta

30

Crea una actividad base para tu aplicación y reemplaza en Crear para establecer el tema. Derive todas sus otras actividades de esta actividad base.

También puedes ver este tutorial: http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

+0

Esto es esencialmente lo que estoy haciendo. Todavía no es ideal, ya que no hay herencia múltiple, p. para una actividad de lista personalizada, pero el inconveniente es menor. Tutorial muy útil, aunque ya lo leí :) – Cheezmeister

+0

Tengo una BaseListActivity y una actividad base (genérica) en cada aplicación que realizo. BaseListActivity tiene un manejo común de CRUD (lectura, adición, edición, eliminación) integrado, por lo que es muy fácil crear una nueva actividad de lista y simplemente anular algunos métodos. Por supuesto, si agrego un MapActivity o TabActivity, tendré que crear una BaseXActivity para ellos también. A veces, la herencia múltiple es simplemente mejor :) – peter3

+5

Entonces, ¿agregar setTheme para cada actividad, antes de que se llame a "setContentView" es realmente la solución correcta? ¿No hay una sola solución de todo el sistema? Además, ¿qué ocurre con todas las actividades que ya están activas? –

5

Puede ser una buena solución para esto, pero no pude encontrar uno, por lo que terminó haciendo un poco de método de ayuda estático en una clase de ayuda que tiene una actividad y, básicamente, lleva a cabo esas dos líneas tu escribiste. Claro, no es perfecto, pero solo agregar una línea corta de código a cada método onCreate() en mi aplicación era tolerable.

Cuestiones relacionadas