android xml 中的应用命名空间有什么用

Whats the use of app namespace in android xml

下面是 activity(Sunshine udacity android 课程的DetailFragment.xml)

中显示的菜单代码

我不明白为什么下面需要两个不同的命名空间。为什么我不能使用命名空间 android: 而不是 app:

在 xml 下面的部分,当我替换的时候 app:actionProviderClass="android.support.v7.widget.ShareActionProvider" 和 app:actionProviderClass="android.widget.ShareActionProvider"

它似乎给出了一些分配错误,但如果将应用程序更改为 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>

support.v7 是兼容旧 Android 版本。要使用它,你需要添加一个 Gradle 依赖项:

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

我目前也在和你一样学习 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 名称的命名空间。

解决方案来自:link。第一个答案

还要确保应用的 build.gradle 与 link

相同

ShareActionProvider 有两个版本,the android framework's and the v7 support library's

Sunshine 需要支持最小SDK 版本10,而ShareActionProvider 是从API level 14 开始添加到框架中的,那么如何为SDK 10-13 提供该功能?您改用 the support library 版本。

您在此处导入 build.gradle 中的支持库

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

现在回到您关于应用命名空间的问题。 Sunshine在他们支持的低端SDK上使用了框架中没有的属性(actionProviderClass and showAsAction),所以他们需要使用支持库提供的自定义属性,并且使用 自定义属性 你需要使用 app 命名空间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>