【问题标题】:Maintaining backward compatibility with Material Design保持与 Material Design 的向后兼容性
【发布时间】:2015-07-17 08:03:56
【问题描述】:

我正在尝试实现一个带有 Material Design 着色标题栏的活动。

我的标准风格是:

<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 中的彩色标题栏和可接受的前 Lollipop 标题栏?我知道通过额外的工作,我可以有一个彩色的棒棒糖前标题栏,但目前不需要。

【问题讨论】:

  • 抱歉,我不确定格式化结果的最佳方式,我真的需要一张表格。

标签: android android-5.0-lollipop material-design backwards-compatibility


【解决方案1】:

如果您使用的是 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>

并根据Consistent Design with AppCompat DevByte 为您的所有活动使用AppCompatActivity。这将在所有 API7+ 设备上为您提供一个带有 colorPrimary 的操作栏,在 API21+ 设备上为您提供 colorPrimaryDark 的状态栏(旧设备不支持彩色状态栏),并在您的操作栏上显示浅色文本(使用 Theme.AppCompat.Light 如果您希望在操作栏上显示深色文本)。

【讨论】:

    【解决方案2】:

    您应该将非 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 的一致行为

    【讨论】:

    • 这等于说现在不应该针对 Lollipop API 进行开发,而是坚持使用兼容性库。没有可行的方法为 pre-v21 和 21+ 提供代码
    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多