对较低 API 的样式和主题支持

style and theme support for lower APIs

以下

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="fontFamily">@font/myfont</item>
</style>

工作正常,但以下

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="android:fontFamily">@font/myfont</item>
</style>

需要 API 16 级。

现在我很困惑,我只是通过删除 android: 前缀来隐藏错误,还是在 android 4.0 上可以正常工作?

首先,让我们考虑一下属性在布局中的工作方式。如果你使用支持库来处理字体系列,你会这样写:

<TextView
    app:fontFamily="@font/myfont"
    .../>

另一方面,如果您使用的是 API 框架(仅存在于 API 16+ 上),您可以这样写:

<TextView
    android:fontFamily="@font/myfont"
    .../>

当您创建样式时,任何在布局中使用 app: 命名空间的东西根本不会获得任何命名空间。所以样式指定

<item name="fontFamily">

将对应于上面的第一个示例,而样式指定

<item name="android:fontFamily">

对应上面的第二个例子。

无论您选择使用哪个,都应遵循这一原则。如果您使用的是支持库,那么删除命名空间是一件好事。如果您不使用支持库,那么删除命名空间是一件坏事。

tl;dr:在这种情况下删除命名空间是个好主意。