2011-01-11 4 views
36

Sto tentando di ottenere un tema scelto dall'utente e mi sento come se fossi frustrante vicino. Definire il tema in AndroidManifest.xml funziona come dovrebbe, ma (come meglio posso dire) non possono cambiare in base alle preferenze app:Passaggio a livello di applicazione a livello di programma in modo programmatico?

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

In alternativa, impostandola in modo dinamico in ogni attività funziona anche:

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

Ma quello sembra disordinato, e preferirei impostare il tema per l'intera app in un unico posto. Il mio primo pensiero è stato quello di afferrare il contesto dell'applicazione non appena i miei principali lanci di attività e di farlo lì:

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

Come meglio posso dire, this dovrebbe fare il trucco, ma in realtà non sta facendo nulla - il l'intera app ha lo stile Android predefinito. È valido quanto sopra, e se sì, potrei fare qualcosa di altrimenti stupido?

Sto lavorando al livello API 3 se questo è importante. I prodotti nella giusta direzione sono molto apprezzati!

Related question.

risposta

30

Creare un'attività di base per l'app e sovrascrivere onCreate per impostare il tema. Ottieni tutte le altre attività da questa attività di base.

controllare anche questo tutorial: http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

+0

Questo è in sostanza quello che sto facendo. Non è ancora l'ideale, poiché non esiste un'eredità multipla, ad es. per una ListActivity personalizzata, ma l'inconveniente è minore. Tutorial molto utile, anche se l'ho già letto :) – Cheezmeister

+0

Ho in pratica una BaseListActivity e un'attività Base (Generic) in ogni app che faccio. BaseListActivity ha una gestione comune di CRUD (leggi, aggiungi, modifica, elimina) integrato, quindi è molto facile creare una nuova attività di lista e sovrascrivere solo alcuni metodi. Ovviamente, se aggiungo MapActivity o TabActivity, dovrei creare anche BaseXActivity per loro. A volte l'eredità multipla è solo meglio :) – peter3

+5

Quindi aggiungere setTheme per ogni attività, prima che venga chiamato "setContentView" è davvero la soluzione corretta? non c'è una soluzione a livello di sistema singolo? inoltre, cosa succede con tutte le attività che sono già in vita? –

5

Ci può essere una buona soluzione a questo, ma non riuscivo a trovare uno, così ho finito per fare un metodo di supporto statica poco in una classe di supporto che richiede un'attività e svolge fondamentalmente quelle due righe hai scritto. Certo, non è perfetto, ma è sufficiente aggiungere una sola riga di codice a ogni metodo onCreate() nella mia app.