Estoy seguro de que todos los que han trabajado con Android antes están familiarizados con la declaración de espacio de nombres xml xmlns:android = xmlns:android="http://schemas.android.com/apk/res/android. Aquí es donde radica mi pregunta.

Si la declaración de espacio de nombres anterior es principalmente para identificación única, ¿de dónde vienen exactamente todos los atributos como android:layout_width o android:layout_height?

La única forma en que puedo entender esto es si xmlns:android="http://schemas.android.com/apk/res/android es un esquema que contiene atributos predefinidos como resultado, se le permite modificar todos estos atributos. Si ese es el caso, ¿dónde se almacena este esquema?

He echado un vistazo al enlace de arriba para ver si mi publicación es potencialmente una publicación duplicada, pero no lo es. La otra publicación básicamente te dice lo que hace xmlns:android="http://schemas.android.com/apk/res/android. Sin embargo, ya sé cuál es la función de esa declaración de espacio de nombres. Mi preocupación es ¿cómo sabe Android qué atributos hay para cada elemento cuando el espacio de nombres anterior no hace referencia a nada? o al menos creo que el espacio de nombres anterior no hace referencia a nada.

0
Wowzer 13 dic. 2016 a las 01:52
Posible duplicado de en relación con xmlns de Android
 – 
OneCricketeer
13 dic. 2016 a las 01:55
Con respecto a su edición, ha habido varias preguntas similares. Y no ha habido una respuesta clara, al menos la que yo he encontrado. Lo que está preguntando está muy claramente documentado aquí. developer.android.com/guide/topics/resources/…
 – 
OneCricketeer
13 dic. 2016 a las 02:13
Y como esas respuestas dicen "es un URI, no una URL", lo que significa que no puede simplemente ir a esa dirección en el navegador y esperar que aparezca un resultado.
 – 
OneCricketeer
13 dic. 2016 a las 02:16
Lo siento mucho si te confundí. Tal vez mi pregunta no sea muy clara, así que permíteme volver a aclararla. Siempre que escribe cosas como android: dentro de una etiqueta de elemento como diseño relativo, android le da sugerencias sobre cuáles podrían ser esos atributos. Cosas como android: background, android: layout_width, android: padding. Ahora mi pregunta no es qué son estos atributos y qué hacen, sino dónde se definen estos atributos. Estoy seguro de que tienen que estar en algún lugar para que Android sepa cómo levantarlos para el elemento específico.
 – 
Wowzer
13 dic. 2016 a las 02:17

1 respuesta

La mejor respuesta

El espacio de nombres no hace referencia a nada. Es necesario saber qué atributos extraer.

Aquí hay un fragmento del código fuente de Android para un ViewGroup.

<declare-styleable name="ViewGroup_Layout">
    <!-- Specifies the basic width of the view.  This is a required attribute
         for any view inside of a containing layout manager.  Its value may
         be a dimension (such as "12dip") for a constant width or one of
         the special constants. -->
    <attr name="layout_width" format="dimension">
        <!-- The view should be as big as its parent (minus padding).
             This constant is deprecated starting from API Level 8 and
             is replaced by {@code match_parent}. -->
        <enum name="fill_parent" value="-1" />
        <!-- The view should be as big as its parent (minus padding).
             Introduced in API Level 8. -->
        <enum name="match_parent" value="-1" />
        <!-- The view should be only big enough to enclose its content (plus padding). -->
        <enum name="wrap_content" value="-2" />
    </attr>
    <!-- Specifies the basic height of the view.  This is a required attribute
         for any view inside of a containing layout manager.  Its value may
         be a dimension (such as "12dip") for a constant height or one of
         the special constants. -->
    <attr name="layout_height" format="dimension">
        <!-- The view should be as big as its parent (minus padding).
             This constant is deprecated starting from API Level 8 and
             is replaced by {@code match_parent}. -->
        <enum name="fill_parent" value="-1" />
        <!-- The view should be as big as its parent (minus padding).
             Introduced in API Level 8. -->
        <enum name="match_parent" value="-1" />
        <!-- The view should be only big enough to enclose its content (plus padding). -->
        <enum name="wrap_content" value="-2" />
    </attr>
</declare-styleable>

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/attrs.xml#3005

¿Cómo sabe Android qué atributos hay para cada elemento?

No es diferente a definir atributos personalizados para su View personalizado clase, se extrae de un res/values/attrs.xml que se encuentra dentro del SDK.

Haciendo referencia a una sección allí.

Una vez que defina los atributos personalizados, puede usarlos en archivos XML de diseño como atributos integrados. La única diferencia es que sus atributos personalizados pertenecen a un espacio de nombres diferente. En lugar de pertenecer al espacio de nombres http://schemas.android.com/apk/res/android, pertenecen a http://schemas.android.com/apk/res/[your package name]

Entonces, android es solo el espacio de nombres para los atributos integrados.

1
OneCricketeer 13 dic. 2016 a las 02:24
Vaya, gracias, esto es precisamente lo que estaba buscando. Pero solo una parte rápida que no entiendo. res / values ​​/ atttrs.xml no parece encajar en ningún lugar en "schemas.android.com/ apk / res / android ". Es un poco extraño para mí debido al hecho de que res / values! = Res / android y aún puedes hacer referencia a los atributos. ¿Te importaría desarrollar un poco esta parte?
 – 
Wowzer
13 dic. 2016 a las 02:28
Hay your.package.name.R para acceder a sus recursos desde Java, luego está android.R para acceder a los recursos del SDK. Es el mismo concepto, solo así es como funciona XML. res/[your package name] == your.package.name.R y res/android == android.R
 – 
OneCricketeer
13 dic. 2016 a las 02:32
Oh, ok, entonces res / android == android.R pero si ese es el caso, ¿no debería necesitar hacer res / android / attr para hacer referencia a los atributos en el declare styleable?
 – 
Wowzer
13 dic. 2016 a las 02:37
No. Sigue adelante e inténtalo. Probablemente no funcione. Ese espacio de nombres es para todos los recursos dentro del archivo attrs.xml del SDK, que se incluye junto con todos los demás recursos y está disponible en android.R. El / attr sería redundante, en mi opinión
 – 
OneCricketeer
13 dic. 2016 a las 03:32