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

26

我一直在编写Android应用程序,但我不太理解何时使用app:和何时使用android:。 当样式未按预期应用时,我会尝试使用一些试错方法,有时会发现使用app:而不是android:可以解决问题,但我不知道原因。如果有人能指点我正确的方向,那就太好了。谢谢!


3
当你使用自定义属性时,它也适用于支持库中的属性。而且"app"并不精确,因为它只是命名空间的快捷方式,它的含义取决于定义(例如:如果您添加xmlns:and="http://schemas.android.com/apk/res/android",则可以使用 and:代替android:)。 - Selvin
5个回答

10

您可以使用app命名空间来实现与旧API版本的应用兼容性。

例如,app:srcCompat="@drawable/customborder" 与android:background="@drawable/customborder"具有相同的效果。不同之处在于,第一个将正确地在旧API上运行,而第二个则不能显示您想要的结果。


7
您谈论的是自定义命名空间。在Android中,我们可以创建自定义视图以及已有的视图。
根据Google开发人员文档,要将内置视图添加到用户界面中,您需要在XML元素中指定它,并使用元素属性控制其外观和行为。编写良好的自定义视图也可以通过XML添加和样式化。要在自定义视图中启用此行为,您必须:
1. 在资源元素中为视图定义自定义属性 2. 在XML布局中指定属性值 3. 在运行时检索属性值 4. 将检索到的属性值应用于您的视图
一旦定义了自定义属性,您可以像内置属性一样在布局XML文件中使用它们。唯一的区别是您的自定义属性属于不同的命名空间。它们不属于http://schemas.android.com/apk/res/android 命名空间,而属于 http://schemas.android.com/apk/res/[your 包名]。
因此,如果您使用默认视图,则可以使用android命名空间;如果要设置和使用自定义视图的属性,则可以定义自己的名称。
请参考此链接

6

如果你查看你的布局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 文件中指定的自定义属性,或者由使用的库之一中的其他人指定的属性。

4
有时候,安卓上的某些属性只在新版本中可用,比如 在这种情况下,你应该使用app:...来确保它能在旧版本上正常工作。

这是目前为止最好的答案! - blackHawk

1
此文句为英文,意思为:“此外,您将找到两种变体。”同时保留了HTML标签,不进行解释。
xmlns:app="http://schemas.android.com/apk/res-auto" 

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

xmlns行之间的区别在于res-auto会解析我们的包名,因为有时我们会在包名中添加.debug或.test,而我们已经提供了应用程序的包ID。例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接