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.