เมื่อใดควรใช้ Theme.AppCompat กับ ThemeOverlay.AppCompat


114

มีคลาส Theme.AppCompat ดังต่อไปนี้:

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

และคลาส ThemeOverlay.AppCompat ต่อไปนี้:

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

เหตุใดจึงต้องใช้ ThemeOverlay.AppCompat.light กับ Theme.AppCompat.Light ฉันเห็นว่ามีแอตทริบิวต์ที่กำหนดไว้สำหรับ ThemeOverlay น้อยกว่ามาก - ฉันอยากรู้ว่ากรณีการใช้งานที่ตั้งใจไว้สำหรับ ThemeOverlay คืออะไร

คำตอบ:


71

ตามธีมนี้กับบล็อกโพสต์สไตล์โดยผู้สร้าง AppCompat:

[ThemeOverlays] เป็นธีมพิเศษที่ซ้อนทับธีมปกติธีมวัสดุเขียนทับแอตทริบิวต์ที่เกี่ยวข้องเพื่อทำให้สว่าง / มืด

ThemeOverlay + ActionBar

นอกจากนี้คุณยังจะได้เห็นอนุพันธ์ของ ActionBar ThemeOverlay:

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

สิ่งเหล่านี้ควรใช้กับ Action Bar ผ่านทางactionBarThemeแอตทริบิวต์ใหม่หรือตั้งค่าโดยตรงบน Toolbar ของคุณ

สิ่งเดียวที่ทำให้พ่อแม่ของพวกเขาแตกต่างไปจากเดิมก็คือพวกเขาเปลี่ยนcolorControlNormalไปเป็นandroid:textColorPrimaryทำให้ข้อความและไอคอนทึบแสง


155

Theme.AppCompat ใช้เพื่อตั้งค่าธีมส่วนกลางสำหรับทั้งแอป ThemeOverlay.AppCompat ใช้เพื่อแทนที่ (หรือ "วางซ้อน") ธีมนั้นสำหรับมุมมองเฉพาะโดยเฉพาะ Toolbar

ลองดูตัวอย่างว่าเหตุใดจึงจำเป็น

ธีมแอพที่มี ActionBar

โดยปกติแล้ว ActionBar จะแสดงในแอป ฉันสามารถเลือกสีได้โดยการตั้งcolorPrimaryค่า อย่างไรก็ตามการเปลี่ยนธีมจะเปลี่ยนสีของข้อความบน 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>

ใส่คำอธิบายภาพที่นี่

เนื่องจากสีหลักของฉันเป็นสีน้ำเงินเข้มฉันจึงควรใช้หนึ่งในธีมที่ใช้สีข้อความอ่อนในแถบการทำงานเพราะข้อความสีดำอ่านยาก

การซ่อน ActionBar และการใช้ Toolbar

จุดรวมของการใช้ Theme.AppCompat แทนที่จะเป็น Theme.Material คือเพื่อให้เราสามารถอนุญาตให้ Android เวอร์ชันเก่าใช้ธีมดีไซน์ Material ของเราได้ ปัญหาคือ Android เวอร์ชันเก่าไม่รองรับ ActionBar ดังนั้นเอกสารประกอบจึงแนะนำให้ซ่อน ActionBar และเพิ่ม Toolbar ในเค้าโครงของคุณ ในการซ่อน ActionBar เราต้องใช้หนึ่งในNoActionBarธีม ภาพต่อไปนี้แสดงแถบเครื่องมือที่มี ActionBar ซ่อนอยู่

ใส่คำอธิบายภาพที่นี่

แต่ถ้าฉันต้องการบางอย่างเช่นธีมแสงกับ DarkActionBar ล่ะ? เนื่องจากฉันต้องใช้ NoActionBar นั่นจึงไม่ใช่ตัวเลือก

การลบล้างธีมของแอพ

นี่คือที่ที่ ThemeOverlay เข้ามาฉันสามารถระบุธีม Dark ActionBar ในเค้าโครง xml Toolbar ของฉันได้

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

ในที่สุดสิ่งนี้ก็ช่วยให้เรามีเอฟเฟกต์ที่เราต้องการ ธีม Dark.ActionBar ซ้อนทับธีมแอพ Light สำหรับโอกาสนี้โดยเฉพาะ

ใส่คำอธิบายภาพที่นี่

  • ธีมแอป: Theme.AppCompat.Light.NoActionBar
  • ธีมแถบเครื่องมือ: ThemeOverlay.AppCompat.Dark.ActionBar

หากคุณต้องการให้เมนูป๊อปอัพสว่างคุณสามารถเพิ่มสิ่งนี้:

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

ศึกษาเพิ่มเติม

ฉันเรียนรู้สิ่งนี้ผ่านการทดลองและจากการอ่านบทความต่อไปนี้


จะทำให้แถบสถานะโปร่งใสเมื่อใช้ Themeoverlay ได้อย่างไร?
gegobyte

ฉันสงสัยว่าจะบรรลุสิ่งนี้ได้อย่างไรด้วย MaterialToolbar ใหม่
David

@David ตอนนี้ฉันทำงานกับ Flutter เป็นส่วนใหญ่ดังนั้นฉันจึงไม่ได้ติดตามการพัฒนา Android ใหม่ ๆ หากคุณพบคำตอบโปรดกลับมาที่นี่และแสดงความคิดเห็นแก้ไขคำตอบของฉันหรือเพิ่มคำตอบของคุณเอง
Suragch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.