Android 布局 - 何时使用 app: vs android:?

Android Layout - when to use app: vs android:?

我一直在编写一些 Android 应用程序,但我不太明白何时使用 app: 以及何时使用 android:。当样式没有按照预期的方式应用时,我会反复试验,有时发现使用 app: 而不是 android: 可以解决问题,但我不明白为什么。如果有人能指出我正确的方向,那就太好了。谢谢!

如果您查看布局 xml 文件(您在其中使用 app:)的开头,您将(可能)找到如下行:

<?xml version="1.0" encoding="utf-8"?>
<SOME_LAYOUT xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"

在这种情况下,app: 命名空间将用于自定义属性,由您在 attrs.xml 文件中指定,或由其他人在使用的库之一中指定。

您在谈论自定义 namespace.In android 我们可以在现有视图之外创建自定义视图。 根据 Google 开发者文档.. 要将内置视图添加到您的用户界面,您可以在 XML 元素中指定它并使用元素属性控制它的外观和行为。还可以通过 XML 添加编写良好的自定义视图并设置样式。要在您的自定义视图中启用此行为,您必须:

在资源元素中为您的视图定义自定义属性 在 XML 布局中指定属性值 在运行时检索属性值 将检索到的属性值应用于您的视图

定义自定义属性后,您可以像使用内置属性一样在布局 XML 文件中使用它们。唯一的区别是您的自定义属性属于不同的命名空间。而不是属于http://schemas.android.com/apk/res/android namespace, they belong to http://schemas.android.com/apk/res/[your包名]

因此,如果您使用默认视图,您可以使用 android 命名空间,如果您想设置和使用自定义视图的属性,您可以定义您自己的名称。

参考this

此外,您会发现两个变体

xmlns:app="http://schemas.android.com/apk/res-auto" 

xmlns:app="http://schemas.android.com/apk/[packagename]"

xmlns 行之间的区别是 res-auto 负责解析我们的包,因为有时我们会在我们的包中添加 .debug 或 .test 并且我们已经提供了应用程序的 packageid 例如:

xmlns:app="http://schemas.android.com/apk/com.test.io.debug"
xmlns:app="http://schemas.android.com/apk/com.test.io.test"

您可以使用应用命名空间使应用与旧 API 版本兼容。

例如 app:srcCompat="@drawable/customborder" 具有相同的效果 android:background="@drawable/customborder" 不同之处在于,第一个可以与较早的 API 一起正常工作,而第二个不会显示您想要的内容。

有时 属性 和 android 仅在新的 Android 版本中可用,例如

在这种情况下,您应该使用 app:... 以使其与旧版本一起使用。