Aktivitenin temasını programlı olarak değiştirin


121

Bazı durumlarda, iletişim temasını aktivitemden kaldırmam gerekiyor ancak işe yaramıyor gibi görünüyor. İşte bir örnek

İlk aktivite:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startActivity(new Intent(MainActivity.this, SecondActivity.class));
}

İkinci aktivite:

public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setTheme(android.R.style.Theme);
    setContentView(R.layout.activity_second);
}

Manifest alıntı:

 <activity android:name="SecondActivity" android:theme="@android:style/Theme.Dialog"></activity>

Çalıştırdığımda hala diyalog temalı.

API10

Teşekkürler.

Yanıtlar:


184

Gibi dokümanlar demek aramak zorunda setThemeherhangi görünüm çıkışı öncesinde. O görünüyor super.onCreate()katılmaktadır viewişlenmesi.

Dolayısıyla, temalar arasında dinamik olarak geçiş yapmak için setThemeönce super.onCreateşu şekilde aramanız gerekir :

public void onCreate(Bundle savedInstanceState) {
    setTheme(android.R.style.Theme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
}

Android 5.1 yığınına sahip MotoG (v1) üzerinde benim için çalışıyor. Sizin için çalışmıyorsa lütfen cihazı + android sürümünü paylaşın.
— lenrok258

Burada açıklandığı gibi bir tema tanımlamam gerekiyordu: stackoverflow.com/a/44236460/3211335 Ve sonra bu yanıtla açıklandığı gibi ayarlamam gerekiyordu. Harika çalışıyor.
— LaloLoop

Her neyse, sayfa başına tema ayarlamak yerine sadece bir kez tema belirleyebildik mi
— gayan1991

Temayı kaydetmek için paylaşılan tercihi kullanıyorum, ancak uygulamayı yeniden başlatırken, bir an için ilk tema, ardından ikinci tema görünüyor!
— Mohammad Afrashteh

1
@ gayan1991 Temanızı tanımlamak ve diğer tüm etkinliklerinizi genişletmek için başka bir etkinlik kullanabilirsiniz, örn: pastebin.com/r93qrRDG düzenleme: daha iyi bir biçimlendirme için pastebin kullanın
— SocialSupaCrew

46

user1462299'un yanıtı harika çalışıyor, ancak parçalar eklerseniz orijinal etkinlikler temasını kullanacaklar. Temayı tüm parçalara da uygulamak için , bunun yerine Context'in getTheme () yöntemini geçersiz kılabilirsiniz :

@Override
public Resources.Theme getTheme() {
    Resources.Theme theme = super.getTheme();
    if(useAlternativeTheme){
        theme.applyStyle(R.style.AlternativeTheme, true);
    }
    // you could also use a switch if you have many themes that could apply
    return theme;
}

Artık onCreate () Yönteminde setTheme () 'yi çağırmanıza gerek yok. Bu bağlamda mevcut temayı bu şekilde almak için her isteği geçersiz kılıyorsunuz.


2
@ kim olumsuz oy verdiyse: cevabımla ilgili neyi beğenmediğinizi açıklamak ister misiniz?
— Björn Kechel

GetTheme () Aktivitede veya ilgili Parçalarda geçersiz kılınmalı mı? Bunu Aktivite'de uyguladım, ancak Parçalar hala orijinal Aktivite temasını kullanıyor.
— saltandpepper

@saltandpepper Aktivitede bunu geçersiz kılmak yeterlidir. Parça kodunuzun ve düzeninizin tekrar değiştirmediğinden emin olun.
— Björn Kechel

Bu benim için işe yaramadı, ancak stackoverflow.com/a/15496425/494179 adresinde verilen yanıt işe yaradı.
— saltandpepper

2
İyi nokta user1269737, bu yüzden ağır bir hesaplama olmadığından emin olmalısınız. Bir stili basit bir durum içinde döndürmek performansı etkilemez.
— Björn Kechel

12

Geç kaldığımı biliyorum, ancak buraya bir çözüm göndermek istiyorum:
Tam kaynak kodunu buradan kontrol edin .
Tercihleri ​​kullanarak temayı değiştirirken kullandığım kod bu ..

SharedPreferences pref = PreferenceManager
        .getDefaultSharedPreferences(this);
String themeName = pref.getString("prefSyncFrequency3", "Theme1");
if (themeName.equals("Africa")) {
    setTheme(R.style.AppTheme);



} else if (themeName.equals("Colorful Beach")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
    setTheme(R.style.beach);


} else if (themeName.equals("Abstract")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();

    setTheme(R.style.abstract2);

} else if (themeName.equals("Default")) {

    setTheme(R.style.defaulttheme);

}

Lütfen setcontentview'dan önce kodu girmeniz gerektiğini unutmayın ..

MUTLU KODLAMA!


neden? cevap doğru mu ?!
— dondondon

Temayı kaydetmek için paylaşılan tercihi kullanıyorum, ancak uygulamayı yeniden başlatırken, bir an için ilk tema, ardından ikinci tema görünüyor!
— Mohammad Afrashteh

0

Bu benim için iyi çalışıyor:

theme.applyStyle(R.style.AppTheme, true)

Kullanımı:

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    //The call goes right after super.onCreate() and before setContentView()
    theme.applyStyle(R.style.AppTheme, true)
    setContentView(layoutId)
    onViewCreated(savedInstanceState)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.