【问题标题】:Why and when we need to add android: prefix to style?为什么以及何时需要在样式中添加 android: 前缀?
【发布时间】:2017-05-05 12:07:21
【问题描述】:

我看到有些样式属性需要android前缀,有些则不需要。是什么原因。喜欢

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

为什么我们没有使用android:windowActionBarandroid:windowNoTitle

【问题讨论】:

    标签: android styles android-theme


    【解决方案1】:

    基于 SDK 版本,Android 样式被分组在不同的命名空间中。为了覆盖一个主题,你必须遵循它的命名空间。

    这就是你在扩展 AppCompat 主题时不需要 android: 前缀的原因,但是如果你想要别的东西,比如说 Theme.Holo - 你会有 2 种不同的样式用于它们 - 一种用于棒棒糖之前的设备,一个用于-21,后者在每个样式属性之前都有android: 前缀。

    【讨论】:

    • 但是我怎么记得什么时候添加它,什么时候忽略它。对于 AppCompat 并不总是需要它。但是,如果我们将它用于类似 Holo 的主题,我们必须为 style.xml 创建两个文件夹,一个用于不带 android 前缀的 lolipop,另一个用于带前缀。我说的对吗??
    • 是的,Holo 将使用 2 个不同的 xml——一个在样式中,一个在样式 21 中。我不确定是否有办法告诉您何时必须这样做,但在大多数情况下,IDE 会显示您需要更高 API 级别的错误,并且快速搜索 SO 将帮助您解决问题跨度>
    【解决方案2】:

    这取决于您使用的主题和上下文。这些属性由不同的来源定义。

    如果属性名称以android:为前缀,它是一个框架属性,只能用于定义了它的Android版本。

    如果属性根本没有前缀,则属性由您自己的应用程序定义。这包括您从库中提取的所有属性定义。

    在您的示例中,您正在为 AppCompat 定义一个主题,它是支持库的一部分,因此也是您的应用程序的一部分。框架小部件不会直接识别这些颜色。

    【讨论】:

    • 我已经多次遇到问题,但仍然没有了解其中的区别。我不明白为什么android:elevation 有效但elevation 无效。以及为什么cornerRadiusandroid:cornerRadius 也有效。
    • @ShivamPokhriyal 它总是取决于谁在阅读价值。所以如果elevation 不起作用,那只是意味着它永远不会被这样读取。
    • 是的,但是有没有万无一失的方法可以提前知道是否使用android:前缀?
    • 不是真的,抱歉。也许你会找到一些很好的文档。我通常会阅读资料以了解行为。
    • 哦,好吧。 FWIW,我使用 elevation 用于 materialChip,但它不起作用,但 android:elevation 起作用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2013-12-15
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多