2011-01-11 5 views
36

Kullanıcı tarafından seçilen bir temayı bulmaya çalışıyorum ve hayal kırıklığına uğramış gibi hissediyorum. AndroidManifest.xml çalışmalarında tema (en iyi ben anlarım) olması gerektiği, ancak tanımlama uygulaması tercihlerine göre değişir edemez: AlternatifUygulama genelinde tema programlı olarak mı değiştiriliyor?

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

her aktivitede dinamik olarak ayarlayarak da çalışır:

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

Ancak bu karışık görünüyor ve tüm uygulama için temayı tek bir yere yerleştirmeyi tercih ediyorum. İlk düşüncem benim ana faaliyet lansmanları en kısa sürede uygulama bağlamı kapmak için oldu ve orada yapın: anlayabilirim iyi olarak

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

, this hile yapmak gerektiğini, ama aslında hiçbir şey yapmıyor - tüm uygulamanın varsayılan Android stili vardır. Yukarıdaki geçerli ve eğer öyleyse, başka bir şey yapamıyorum?

Önemliyse API düzey 3'te çalışıyorum. Doğru yönde prodüksiyonlar büyük beğeni topladı!

Related question.

cevap

30

Uygulamanız için bir temel Etkinlik oluşturun ve temayı ayarlamak için onCreate özelliğini geçersiz kılın. Bu diğer etkinliklerden tüm diğer faaliyetlerinizi türetin. Bu aslında benim yaptığım ne http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

+0

:

Ayrıca, bu öğretici kontrol edin. Hala ideal değildir, çünkü birden fazla kalıtım yoktur, örn. Özel bir ListActivity için, ancak rahatsızlık küçüktür. Çok yararlı öğretici, zaten okudum bile :) – Cheezmeister

+0

Ben her uygulamada bir BaseListActivity ve bir Base (Jenerik) Aktivitesi var. BaseListActivity, yerleşik CRUD (okuma, ekleme, düzenleme, silme) işlemlerinin ortak bir uygulamasına sahiptir, bu nedenle yeni bir liste etkinliği oluşturmak ve birkaç yöntemi geçersiz kılmak çok kolaydır. Tabii ki, bir MapActivity veya TabActivity eklerseniz, onlar için de bir BaseXActivity oluşturmanız gerekir. Bazen çok kalıtım daha iyidir :) – peter3

+5

Bu yüzden her aktivite için setTheme eklenmesi, "setContentView" çağrılmadan önce gerçekten doğru çözümdür? Tek bir sistem çözümü yok mu? Ayrıca, zaten canlı olan tüm aktivitelerde ne olur? –

5

Buna iyi bir çözüm olabilir, ama ben bir bulamadık, bu yüzden bir Aktivite götüren bir yardımcı sınıfında biraz statik yardımcı yöntemi yapma sona erdi ve temelde bu iki satır gerçekleştirir sen yazdın. Elbette, bu mükemmel değil, ancak uygulamamdaki her bir onCreate() yöntemine bir kısa satır kod eklenmesi kabul edilebilir.