保持与 Material 设计的向后兼容性

Maintaining backward compatibility with Material Design

我正在尝试实现具有 Material Design 有色标题栏的 activity。

我的标准风格是:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
</style>

我的 v21 风格是:

<style name="AppTheme" parent=" -see rest of this post- ">
    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:colorPrimaryDark">@color/primary_dark</item>
    <item name="android:colorAccent">@color/accent</item>
</style>

我得到的结果是:

API 18:
MyActivity extends AppCompatActivity
-- Black title bar, this is good enough.
MyActivity extends Activity:
-- No title bar.
API 21:
MyActivity extends Activity, parent="android:Theme.Material.Light"
-- Perfect green tinting of status bar and title bar.
MyActivity extends AppCompatActivity, parent="android:Theme.Material.Light"
-- Crashes with: You need to use a Theme.AppCompat theme (or descendant) with this activity.
MyActivity extends AppCompatActivity, parent="Theme.AppCompat.Light"
-- Status bar is correctly green tinted. Title bar has no background colour.
MyActivity extends AppCompatActivity, parent="Theme.AppCompat.Light.DarkActionBar"
-- Status bar is correctly green tinted. Title bar has black background colour.

如何在 Lollipop 中获得彩色标题栏和可接受的 pre-Lollipop?我知道通过额外的工作我可以有一个彩色的 pre-lollipop 标题栏,但目前不需要。

您应该将非 android 命名空间属性与支持库一起使用:

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

不需要 v21 版本。这将使您的行为回到 API 级别 7

如果您使用的是 AppCompat,那么所有 material color palette 属性(例如 colorPrimary)都可用于所有 API 级别,因此您可以编写一个主题:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
</style>

并使用AppCompatActivity for all of your activities as per the Consistent Design with AppCompat DevByte。这将为您在所有 API7+ 设备上提供一个带有 colorPrimary 的操作栏,在 API21+ 设备上提供一个 colorPrimaryDark 的状态栏(旧设备不支持彩色状态条)和操作栏上的浅色文本(如果你想在操作栏上使用深色文本,请使用 Theme.AppCompat.Light)。