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