什么是在android xml中使用app命名空间

时间:2016-03-16 18:44:52

标签: android xml namespaces shareactionprovider

以下是活动中显示的菜单代码(Sunshine udacity android course的DetailFragment.xml)

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

当我更换时,在xml以下部分 应用程式:actionProviderClass = “android.support.v7.widget.ShareActionProvider” 同 应用程式:actionProviderClass = “android.widget.ShareActionProvider”

它似乎给出了一些赋值错误,但如果将app更改为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 个答案:

答案 0 :(得分:11)

有两个版本的ShareActionProvider,the android framework'sv7 support library's

在Sunshine中你需要支持min SDK版本10,而ShareActionProvider从API级别14添加到框架中,那么如何向SDK 10-13提供该功能?您改用the support library版本。

您可以在build.gradle中导入支持库

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

现在回到你关于app命名空间的问题。 Sunshine使用框架中不可用的属性来支持(actionProviderClass和showAsAction)的较低SDK,因此他们需要使用支持库提供的自定义属性,并使用< strong>自定义属性您需要使用应用程序名称空间 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>

答案 1 :(得分: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 名称的命名空间。

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

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

相同

答案 2 :(得分:1)

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

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