Kapan sebaiknya menggunakan Theme.AppCompat vs ThemeOverlay.AppCompat?

113

Ada kelas Theme.AppCompat berikut:

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

dan kelas ThemeOverlay.AppCompat berikut:

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

Mengapa seseorang menggunakan ThemeOverlay.AppCompat.light vs Theme.AppCompat.Light misalnya? Saya melihat bahwa ada jauh lebih sedikit atribut yang ditentukan untuk ThemeOverlay - Saya ingin tahu kasus penggunaan apa yang dimaksudkan untuk ThemeOverlay.

Brendan Weinstein
sumber

Jawaban:

71

Sesuai dengan posting blog Tema vs Gaya ini oleh pembuat AppCompat:

[ThemeOverlays] adalah tema khusus yang menghamparkan tema Theme.Material normal, menimpa atribut yang relevan untuk menjadikannya terang / gelap.

ThemeOverlay + ActionBar

Anda juga akan melihat turunan ActionBar ThemeOverlay:

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

Ini hanya boleh digunakan dengan Bilah Tindakan melalui actionBarThemeatribut baru , atau langsung disetel di Bilah Alat Anda.

Satu-satunya hal yang saat ini dilakukan secara berbeda untuk orang tua mereka adalah mereka mengubah colorControlNormalmenjadi android:textColorPrimary, sehingga membuat teks dan ikon menjadi buram.

ianhanniballake
sumber
155

Theme.AppCompat digunakan untuk menyetel tema global untuk seluruh aplikasi. ThemeOverlay.AppCompat digunakan untuk mengganti (atau "menghamparkan") tema tersebut untuk tampilan tertentu, terutama Toolbar.

Mari kita lihat contoh mengapa hal ini perlu.

Tema aplikasi dengan ActionBar

ActionBar biasanya ditampilkan di aplikasi. Saya bisa memilih warnanya dengan mengatur colorPrimarynilainya. Namun, mengubah tema mengubah warna teks di ActionBar.

<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>

masukkan deskripsi gambar di sini

Karena warna utama saya adalah biru tua, saya mungkin harus menggunakan salah satu tema yang menggunakan warna teks terang di bilah tindakan karena teks hitam sulit dibaca.

Menyembunyikan ActionBar dan menggunakan Toolbar

Inti dari penggunaan Theme.AppCompat daripada Theme.Material adalah agar kami dapat mengizinkan versi Android yang lebih lama untuk menggunakan tema desain material kami. Masalahnya adalah versi Android yang lebih lama tidak mendukung ActionBar. Karenanya, dokumentasi merekomendasikan untuk menyembunyikan ActionBar dan menambahkan Toolbar ke layout Anda. Untuk menyembunyikan ActionBar kita harus menggunakan salah satu NoActionBartema. Gambar berikut menunjukkan Toolbar dengan ActionBar tersembunyi.

masukkan deskripsi gambar di sini

Tetapi bagaimana jika saya menginginkan sesuatu seperti tema Terang dengan DarkActionBar? Karena saya harus menggunakan NoActionBar, itu bukan pilihan.

Mengganti Tema Aplikasi

Di sinilah ThemeOverlay masuk. Saya bisa menentukan tema Dark ActionBar di layout xml Toolbar saya.

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

Ini akhirnya memungkinkan kita untuk mendapatkan efek yang kita inginkan. Tema Dark.ActionBar menghamparkan tema aplikasi Terang untuk acara khusus ini.

masukkan deskripsi gambar di sini

  • Tema Aplikasi: Theme.AppCompat.Light.NoActionBar
  • Tema Toolbar: ThemeOverlay.AppCompat.Dark.ActionBar

Jika Anda ingin menu popup menjadi ringan, Anda dapat menambahkan ini:

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

Pelajaran lanjutan

Saya mempelajarinya melalui eksperimen dan membaca artikel-artikel berikut.

Suragch
sumber
Bagaimana cara membuat bilah status transparan saat menggunakan Themeoverlay?
gegobyte
Saya bertanya-tanya bagaimana mencapai ini dengan MaterialToolbar baru
David
@David, saya kebanyakan bekerja dengan Flutter sekarang, jadi saya belum mengikuti perkembangan Android baru. Jika Anda menemukan jawabannya, silakan kembali ke sini dan tinggalkan komentar, edit jawaban saya, atau tambahkan jawaban Anda sendiri.
Suragch