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

Che*_*wda 8 xml android namespaces shareactionprovider

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

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

在下面的xml部分,当我用app:actionProviderClass ="android.widget.ShareActionProvider"替换app:actionProviderClass ="android.support.v7.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>
Run Code Online (Sandbox Code Playgroud)

Ken*_* S. 13

ShareActionProvider有两个版本,android框架v7支持库.

在Sunshine中你需要支持min SDK版本10,而ShareActionProvider从API级别14添加到框架中,那么如何为SDK 10-13提供该功能呢?您可以使用支持库版本.

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

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:21.0.2'
}
Run Code Online (Sandbox Code Playgroud)

现在回到关于app命名空间的问题.Sunshine使用它们支持的较低SDK (frameProviderClass和showAsAction)框架中没有的属性,因此他们需要使用支持库提供的自定义属性,并使用您需要的自定义属性来使用应用程序命名空间.该机器人命名为框架的属性的名称建议.

<?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>
Run Code Online (Sandbox Code Playgroud)