2011-01-11 9 views
36

Ich versuche ein benutzerdefiniertes Thema zu bekommen und fühle mich wie frustrierend nah. Definition des Themas in AndroidManifest.xml funktioniert, wie es sollte, kann aber (so gut ich kann sagen) ändern sich auf App-Einstellungen basieren nicht:Programmgesteuertes Thema programmgesteuert wechseln?

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

Alternativ kann dynamisch in jede Aktivität Einstellung funktioniert auch:

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

Aber das scheint chaotisch, und ich würde lieber das Thema für die gesamte App an einem Ort festlegen. Mein erster Gedanke war, den Anwendungskontext, sobald meine Haupttätigkeit Einführungen zu packen und macht es dort:

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

Wie am besten ich sagen kann, this sollte den Trick tun, aber in Wirklichkeit ist es nichts zu tun - die Die gesamte App hat den Standard-Android-Stil. Ist das obige gültig und wenn ja, könnte ich etwas anderes dummes tun?

Ich arbeite in API Level 3, wenn das zählt. Prods in die richtige Richtung sehr geschätzt!

Related question.

Antwort

30

Erstellen Sie eine Basisaktivität für Ihre App und überschreiben Sie onCreate, um das Design festzulegen. Leiten Sie alle anderen Aktivitäten von dieser Basisaktivität ab.

Auch dieses Tutorial überprüfen: http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

+0

Dies ist im Wesentlichen, was ich tue. Es ist immer noch nicht ideal, da es keine Mehrfachvererbung gibt, z.B. für eine benutzerdefinierte ListActivity, aber die Unannehmlichkeit ist gering. Sehr hilfreiches Tutorial, obwohl ich es bereits gelesen habe :) – Cheezmeister

+0

Ich habe eigentlich eine BaseListActivity und eine Base (Generic) Activity in jeder App, die ich mache. Die BaseListActivity verfügt über eine integrierte CRUD-Funktion (Lesen, Hinzufügen, Bearbeiten, Löschen), sodass es sehr einfach ist, eine neue Listenaktivität zu erstellen und einfach einige Methoden zu überschreiben. Wenn ich eine MapActivity oder TabActivity hinzufüge, müsste ich natürlich auch eine BaseXActivity für sie erstellen. Manchmal ist Multi-Vererbung einfach besser :) – peter3

+5

Das Hinzufügen von setTheme für jede Aktivität, bevor "setContentView" aufgerufen wird, ist wirklich die richtige Lösung? Gibt es keine einzige systemweite Lösung? Was passiert mit all den Aktivitäten, die bereits am Leben sind? –

5

Es kann eine gute Lösung für dieses Problem sein, aber ich konnte man nicht finden, so landete ich in einer Hilfsklasse eine wenig statische Hilfsmethode bis zu machen, die eine Aktivität nimmt und führt grundsätzlich diese beiden Linien Sie schrieben. Sicher, es ist nicht perfekt, aber nur eine kurze Zeile Code zu jedem onCreate() Methode in meiner App hinzufügen war erträglich.

Verwandte Themen