android xml中应用程序名称空间的用途是什么

android xml中应用程序名称空间的用途是什么,android,xml,namespaces,shareactionprovider,Android,Xml,Namespaces,Shareactionprovider,下面是活动中显示的菜单代码(Sunshine udacity android课程的DetailFragment.xml) 我不明白为什么下面需要两个不同的名称空间。为什么我不能使用名称空间android:而不是app: 在下面的xml部分中,当我替换 app:actionProviderClass=“android.support.v7.widget.ShareActionProvider” 具有 app:actionProviderClass=“android.widget.ShareActi

下面是活动中显示的菜单代码(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版本。要使用此功能,您需要添加渐变依赖项:

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属性使用的是应用程序的名称空间

从找到解决方案:。第一个答案


另外,请确保应用程序的build.gradle与ShareActionProvider的两个版本相同,以及

在Sunshine中,您需要支持min 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>


名称空间不必是应用程序名称。事实上,对支持库支持的属性使用应用程序命名空间是最佳做法。谢谢!那么,应用程序是自定义属性命名空间的标准关键字,还是我们可以使用任何单词作为命名空间?实际上,你可以使用任何单词,但使用标准的应用程序,你可以省去大脑的思考。实际上,在Android Studio中,如果你键入“app”,那么它会尝试使用“appNs”快捷方式为你自动完成整行,这样你也可以省去你的手指打字@如果你觉得我的解释有帮助,你介意接受我的回答作为你的解决方案吗完成。谢谢你的帮助。@KenRatanachaiS。先生,android是如何知道哪个自定义属性属于哪个外部库的?