Chetan Gowda Chetan Gowda - 5 months ago 32
Android Question

Whats the use of app namespace in android xml

Below is the code of a menu being displayed in an activity(DetailFragment.xml of Sunshine udacity android course)

I could not understand why two different namespaces are needed below. Why cant I use the namespace android: instead of app:

In below xml part when I replace
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
with
app:actionProviderClass="android.widget.ShareActionProvider"

It seemed to give some assignment error, but works fine if app is changed to android as below
android:actionProviderClass="android.widget.ShareActionProvider"

I am not able to understand what exactly is happening here.

<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>

Answer

There're two versions of ShareActionProvider, the android framework's and the v7 support library's.

In Sunshine you need to support min SDK version 10, while ShareActionProvider was added into the framework from API level 14, so how to provide the feature to SDK 10-13? You use the support library version instead.

You import the support library in build.gradle here

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

Now back to your question about the app namespace. Sunshine is using the attributes that are not available in the framework on the lower SDKs they support (actionProviderClass and showAsAction), so they need to use the custom attributes provided by the support library, and to use the custom attributes you need to use the app namespace. The android namespace is for the framework attributes as the name suggested.

<?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>