coder123 coder123 - 2 months ago 14
Android Question

What is the 'app' Android XML namespace?

Here is an example of the

app
namespace that I've seen from a
res/menu/main.xml
file

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" >
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="100"
app:showAsAction="never" />
</menu>


What purpose does the
app
namespace serve? Is it a "standard" Android XML namespace? Are the same value options available for the same attribute placed in two different namespaces (e.g.
app:showAsAction
and
android:showAsAction
).

From the docs:
android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]


i.e., would the line in the above example mean something else if the attribute were instead:

android:showAsAction="never"


It almost looks like it might be some sort of "subclassing" mechanism, but I can't seem to find any real documentation on the
app
namespace from Google/Android sources.

Answer

The app namespace is not specific to a library, but it is used for all attributes defined in your app, whether by your code or by libraries you import, effectively making a single global namespace for custom attributes - i.e., attributes not defined by the android system.

In this case, the appcompat-v7 library uses custom attributes mirroring the android: namespace ones to support prior versions of android (for example: android:showAsAction was only added in API11, but app:showAsAction (being provided as part of your application) works on all API levels your app does) - obviously using the android:showAsAction wouldn't work on API levels where that attribute is not defined.