Theme.AppCompat vs ThemeOverlay.AppCompat ne zaman kullanılmalıdır?


114

Aşağıdaki Theme.AppCompat sınıfları vardır:

Theme.AppCompat
Theme.AppCompat.Light
Theme.AppCompat.Light.DarkActionBar
Theme.AppCompat.NoActionBar
Theme.AppCompat.Light.NoActionBar
Theme.AppCompat.DialogWhenLarge
Theme.AppCompat.Light.DialogWhenLarge
Theme.AppCompat.Dialog
Theme.AppCompat.Light.Dialog
Theme.AppCompat.CompactMenu

ve aşağıdaki ThemeOverlay.AppCompat sınıfları:

ThemeOverlay.AppCompat
ThemeOverlay.AppCompat.Light
ThemeOverlay.AppCompat.Dark
ThemeOverlay.AppCompat.ActionBar
ThemeOverlay.AppCompat.Dark.ActionBar

Örneğin neden ThemeOverlay.AppCompat.light vs Theme.AppCompat.Light kullanılır? ThemeOverlay için tanımlanmış çok daha az öznitelik olduğunu görüyorum - ThemeOverlay için amaçlanan kullanım durumunun ne olduğunu merak ediyorum.

Yanıtlar:


71

AppCompat'ın yaratıcısı tarafından hazırlanan bu Tema vs Stil blog gönderisine göre:

[ThemeOverlays], normal Theme.Material temalarını kaplayan ve onları açık / koyu yapmak için ilgili özniteliklerin üzerine yazan özel temalardır.

ThemeOverlay + ActionBar

Keskin gözleriniz ayrıca ActionBar ThemeOverlay türevlerini görmüş olacak:

  • ThemeOverlay.Material.Light.ActionBar
  • ThemeOverlay.Material.Dark.ActionBar

Bunlar yalnızca yeni actionBarThemeöznitelik aracılığıyla Eylem Çubuğu ile kullanılmalı veya doğrudan Araç Çubuğunuzda ayarlanmalıdır.

Bu anda ebeveynlerine farklı yapmasını tek şey onlar değiştirmek olmasıdır colorControlNormalolmak android:textColorPrimarydolayısıyla herhangi bir metin yapma ve simgeler matlaşı-.


155

Theme.AppCompat, uygulamanın tamamı için genel temayı ayarlamak için kullanılır. ThemeOverlay.AppCompat, belirli görünümler, özellikle Araç Çubuğu için bu temayı geçersiz kılmak (veya "kaplamak") için kullanılır.

Bunun neden gerekli olduğuna dair bir örneğe bakalım.

ActionBar ile uygulama temaları

ActionBar normalde bir uygulamada gösterilir. colorPrimaryDeğeri ayarlayarak rengini seçebilirim . Ancak temayı değiştirmek, ActionBar'daki metnin rengini değiştirir.

<style name="AppTheme" parent="Theme.AppCompat">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

görüntü açıklamasını buraya girin

Ana rengim koyu mavi olduğundan, siyah metnin okunması zor olduğu için muhtemelen eylem çubuğunda açık bir metin rengi kullanan temalardan birini kullanmalıyım.

ActionBar'ı gizleme ve bir Araç Çubuğu kullanma

Theme.Material yerine Theme.AppCompat kullanmanın tüm amacı, Android'in eski sürümlerinin materyal tasarım temamızı kullanmasına izin verebilmemizdir. Sorun, Android'in eski sürümlerinin ActionBar'ı desteklememesidir. Bu nedenle, dokümantasyon , ActionBar'ı gizlemenizi ve düzeninize bir Araç Çubuğu eklemenizi önerir. ActionBar'ı gizlemek için NoActionBartemalardan birini kullanmalıyız . Aşağıdaki resimler, ActionBar gizlenmiş olarak Araç Çubuğunu gösterir.

görüntü açıklamasını buraya girin

Peki ya DarkActionBar ile Light teması gibi bir şey istersem? NoActionBar kullanmak zorunda olduğum için bu bir seçenek değil.

Uygulama Temasını Geçersiz Kılma

ThemeOverlay burada devreye giriyor. Araç Çubuğu xml düzenimde Dark ActionBar temasını belirtebilirim.

<android.support.v7.widget.Toolbar
    ...
    android:background="?attr/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

Bu nihayet istediğimiz etkiye sahip olmamızı sağlıyor. Dark.ActionBar teması , bu özel durum için Light uygulama temasının üzerini kaplar .

görüntü açıklamasını buraya girin

  • Uygulama Teması: Theme.AppCompat.Light.NoActionBar
  • Araç Çubuğu Teması: ThemeOverlay.AppCompat.Dark.ActionBar

Açılır menünün hafif olmasını istiyorsanız, şunu ekleyebilirsiniz:

app:popupTheme="@style/ThemeOverlay.AppCompat.Light"

İlerideki çalışma

Bunu deney yaparak ve aşağıdaki makaleleri okuyarak öğrendim.


Themeoverlay kullanırken durum çubuğu nasıl şeffaf hale getirilir?
gegobyte

Bunu yeni MaterialToolbar ile nasıl başaracağımı merak ediyorum
David

@David, şu anda çoğunlukla Flutter ile çalışıyorum, bu yüzden yeni Android geliştirmelerini takip etmedim. Cevabı bulursanız, buraya geri gelip bir yorum bırakmaktan, cevabımı düzenlemekten veya kendi cevabınızı eklemekten çekinmeyin.
Suragch
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.