安卓XML中的应用程序命名空间有什么用?

8
以下是在一个活动中显示菜单的代码(Sunshine udacity android 课程中的 DetailFragment.xml)。我不明白为什么下面需要两个不同的命名空间。为什么不能使用 android: 命名空间代替 app: 呢?
在下面的 xml 部分中,当我将 app:actionProviderClass="android.support.v7.widget.ShareActionProvider" 替换为 app:actionProviderClass="android.widget.ShareActionProvider" 时,似乎会出现一些赋值错误,但如果将 app 更改为 android,它就可以正常工作,如下所示 android:actionProviderClass="android.widget.ShareActionProvider"。
我无法理解这里到底发生了什么。
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_share"
        android:title="@string/action_share"
        app:showAsAction="always"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
</menu>
3个回答

14

有两个版本的ShareActionProvider,Android框架的v7支持库的

在Sunshine项目中,您需要支持最低SDK版本10,而ShareActionProvider从API级别14开始添加到框架中,那么如何为SDK 10-13提供该功能?您可以使用支持库版本。

在build.gradle中导入支持库。

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:21.0.2'
}

现在回到你关于应用程序命名空间的问题。Sunshine正在使用在它们支持的较低SDK上不可用于框架中的属性(actionProviderClass和showAsAction),因此它们需要使用支持库提供的自定义属性,并且要使用应用程序命名空间来使用自定义属性。如名称所示,android命名空间用于框架属性。

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_share"
        android:title="@string/action_share"
        app:showAsAction="always"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
</menu>

谢谢!那么,app是自定义属性的命名空间的标准关键字吗?还是我们可以使用任何单词作为命名空间? - Chetan Gowda
1
你实际上可以使用任何单词,但是使用标准应用程序可以节省大脑思考的时间。实际上,在Android Studio中,如果您键入'app',它将尝试为您自动完成整行代码,并提供'appNs'快捷方式,这样您就可以避免过多输入。 - Ken Ratanachai S.
@ChetaGowda 如果您觉得我的解释有帮助,请考虑接受我的答案作为您的解决方案。 :) - Ken Ratanachai S.
完成了。感谢您的帮助。 - Chetan Gowda
很好的解释! - blackHawk
1
@KenRatanachaiS. 先生,安卓是如何知道哪个自定义属性属于哪个外部库的呢? - Abhay

2

我目前也正在学习Udacity课程,就像你一样。我在detailFragment.xml中指定actionProviderClass时遇到了问题。结果发现actionProviderClass属性必须使用应用程序名称的命名空间。我想这可能是你正在寻找的解决方案。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android = "http://schemas.android.com/apk/res/android"
      xmlns:Sunshine = "http://schemas.android.com/apk/res-auto">
    <item
        android:id = "@+id/action_share"
        android:title = "@string/action_share"
        Sunshine:actionProviderClass = "android.support.v7.widget.ShareActionProvider"
        Sunshine:showAsAction = "always"/>
</menu>

请注意,actionProviderClass属性使用了app名称的命名空间。
解决方案来源: 链接 .第一个答案
还要确保应用的build.gradle与链接中的相同。

命名空间不一定要与应用程序名称相同。事实上,最好使用应用程序命名空间来支持支持库的属性。 - Ken Ratanachai S.

1

support.v7是兼容旧版Android的库。要使用它,您需要添加Gradle依赖项:

dependencies {
        compile 'com.android.support:appcompat-v7:23.0.1'
}

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