¿Qué es el espacio de nombres XML de Android 'app'?

164

Aquí hay un ejemplo del appespacio de nombres que he visto de un res/menu/main.xmlarchivo

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

¿Para qué sirve el appespacio de nombres? ¿Es un espacio de nombres XML "estándar" para Android? Son las mismas opciones de valor disponibles para el mismo atributo colocado en dos espacios de nombres diferentes (por ejemplo, app:showAsActiony android:showAsAction).

De los documentos : android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

es decir, la línea del ejemplo anterior significaría algo más si el atributo fuera:

android:showAsAction="never"

Casi parece que podría ser algún tipo de mecanismo de "subclasificación", pero parece que no puedo encontrar ninguna documentación real sobre el appespacio de nombres de las fuentes de Google / Android.

coder123
fuente

Respuestas:

213

los app espacio de nombres no es específico de una biblioteca, pero se usa para todos los atributos definidos en su aplicación, ya sea por su código o por las bibliotecas que importa, creando efectivamente un único espacio de nombres global para atributos personalizados, es decir, atributos no definidos por el sistema Android .

En este caso, la appcompat-v7biblioteca utiliza atributos personalizados que reflejan los del android:espacio de nombres para admitir versiones anteriores de Android (por ejemplo: android:showAsActionsolo se agregó en API11, pero app:showAsAction(se proporciona como parte de su aplicación) funciona en todos los niveles de API que su aplicación lo hace), obviamente el uso de android:showAsActionno funcionaría en los niveles de API donde ese atributo no está definido.

ianhanniballake
fuente
1
¡Gracias! Estoy feliz de haber encontrado finalmente una mención de esto en la documentación. Sin embargo, una pregunta de seguimiento. La documentación de la barra de acción en su enlace dice: "Observe que el atributo showAsAction anterior usa un espacio de nombres personalizado definido en la etiqueta <menu>. Esto es necesario cuando se usan los atributos XML definidos por la biblioteca de soporte, porque estos atributos no existen en el Marco de Android en dispositivos más antiguos. Por lo tanto, debe usar su propio espacio de nombres como prefijo para todos los atributos definidos por la biblioteca de soporte ".
coder123
1
Entonces, ¿qué sucede en dispositivos más antiguos donde los atributos no existen en el marco? Todavía no me queda claro cómo definir un espacio de nombres personalizado funciona alrededor de la falta de soporte para un atributo. ¿Declarar showAsActionbajo un espacio de nombres personalizado significa que funciona como se esperaba en las plataformas más nuevas y se ignora en las más antiguas?
coder123
44
Los atributos que no existen se ignoran silenciosamente. Cuando crea un atributo personalizado, garantiza que el atributo personalizado existirá en tiempo de ejecución (obviamente: su definición se incluye con su aplicación). Por lo tanto, la biblioteca de soporte utiliza atributos personalizados para que su código personalizado para crear menús pueda usar una ruta de código única que funcione en todas las versiones de API, esencialmente reemplazando cualquier necesidad de usar las android:versiones.
ianhanniballake
2
Lo siento si no solo no lo entiendo. ¿Me pueden ayudar a entender cómo simplemente cambiar el espacio de nombres proporciona una definición para un atributo? Si el showAsNameatributo no está soportado en una biblioteca de más edad, ¿cómo el uso de un espacio de nombres a medida permitirá a la plataforma para conocer la gama de opciones posibles valores ( ifRoom, never, etc.), y saber cómo interpretar esas opciones? Supongo que "atributos que no existen" significa atributos para los que no existe implementación en la biblioteca. Cambiar android:por app:apenas parece una solución completa. ¿Me estoy perdiendo de algo?
coder123
14
Hay dos partes: 1) el atributo personalizado ( app:showAsName) y todos sus valores posibles se incluyen en su aplicación cuando incluye la appcompat-v7biblioteca (que la define en su attrs.xmlarchivo). 2) La biblioteca AppCompat (específicamente, ActionMenuView , que se usa automáticamente cuando se usa ActionBarActivity) analiza y usa app:showAsActionpara mostrar correctamente los elementos de la misma manera en todos los niveles de API. Ciertamente requiere XML y código para trabajar juntos.
ianhanniballake
0

Puedes obtener alguna explicación en este enlace

Espacio de nombres XML

Declaración de espacio de nombres Un espacio de nombres XML se declara utilizando el atributo XML reservado xmlns o xmlns: prefijo, cuyo valor debe ser un nombre de espacio de nombres válido.

Por ejemplo, la siguiente declaración asigna el prefijo "xhtml:" al espacio de nombres XHTML:

xmlns: xhtml = "http://www.w3.org/1999/xhtml"

Cualquier elemento o atributo cuyo nombre comience con el prefijo "xhtml:" se considera que está en el espacio de nombres XHTML, si él o un antepasado tiene la declaración de espacio de nombres anterior.

También es posible declarar un espacio de nombres predeterminado. Por ejemplo:

xmlns = "http://www.w3.org/1999/xhtml"

En este caso, cualquier elemento sin un prefijo de espacio de nombres se considera que está en el espacio de nombres XHTML, si él o un antepasado tiene la declaración de espacio de nombres predeterminada anterior.

Si no hay una declaración de espacio de nombres predeterminada en el alcance, el nombre del espacio de nombres no tiene valor. [6] En ese caso, se considera que un elemento sin un prefijo de espacio de nombres explícito no está en ningún espacio de nombres.

Los atributos nunca están sujetos al espacio de nombres predeterminado. Se considera que un atributo sin un prefijo de espacio de nombres explícito no está en ningún espacio de nombres.

SINGH KIRPAL
fuente