Theme.AppCompat được sử dụng để đặt chủ đề chung cho toàn bộ ứng dụng. ThemeOverlay.AppCompat được sử dụng để ghi đè (hoặc "lớp phủ") chủ đề đó cho các dạng xem cụ thể, đặc biệt là Thanh công cụ.
Hãy xem một ví dụ tại sao điều này là cần thiết.
Chủ đề ứng dụng với ActionBar
ActionBar thường được hiển thị trong một ứng dụng. Tôi có thể chọn màu của nó bằng cách đặt colorPrimary
giá trị. Tuy nhiên, việc thay đổi chủ đề sẽ làm thay đổi màu của văn bản trên 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>
Vì màu chính của tôi là màu xanh lam đậm, có lẽ tôi nên sử dụng một trong những chủ đề sử dụng màu văn bản sáng trong thanh tác vụ vì văn bản màu đen rất khó đọc.
Ẩn Thanh hành động và sử dụng Thanh công cụ
Toàn bộ điểm của việc sử dụng Theme.AppCompat thay vì Theme.Material là để chúng tôi có thể cho phép các phiên bản Android cũ hơn sử dụng chủ đề material design của chúng tôi. Vấn đề là các phiên bản Android cũ hơn không hỗ trợ ActionBar. Do đó, tài liệu khuyên bạn nên ẩn ActionBar và thêm Thanh công cụ vào bố cục của bạn. Để ẩn ActionBar, chúng ta phải sử dụng một trong các NoActionBar
chủ đề. Các hình ảnh sau đây hiển thị Thanh công cụ với Thanh hành động bị ẩn.
Nhưng nếu tôi muốn một thứ gì đó như chủ đề Ánh sáng với DarkActionBar thì sao? Vì tôi phải sử dụng NoActionBar, đó không phải là một tùy chọn.
Ghi đè Chủ đề ứng dụng
Đây là nơi ThemeOverlay xuất hiện. Tôi có thể chỉ định chủ đề Dark ActionBar trong bố cục xml trên Thanh công cụ của mình.
<android.support.v7.widget.Toolbar
...
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
Điều này cuối cùng cho phép chúng tôi có được hiệu ứng mà chúng tôi muốn. Chủ đề Dark.ActionBar phủ lên chủ đề ứng dụng Ánh sáng cho dịp đặc biệt này.
- Chủ đề ứng dụng:
Theme.AppCompat.Light.NoActionBar
- Chủ đề Thanh công cụ:
ThemeOverlay.AppCompat.Dark.ActionBar
Nếu bạn muốn menu bật lên sáng sủa, bạn có thể thêm cái này:
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
Học cao hơn
Tôi học được điều này thông qua thử nghiệm và thông qua việc đọc các bài báo sau.