2010-01-21 15 views
16

Todos sabemos que cuando se genera un id para Android usandoAndroid mecanismo de identificación de colisión para R.java

@+id/foo 

Android nos crea una entrada en R.java como:

public static final class id { 
     public static final int foo=0x7f060005; 
} 

Lo que sucede si hay una colisión de nombre en diferentes archivos xml (digamos, dentro de dos diseños)? El mecanismo @ + id nos garantiza sobrescribir el nombre del id si aún existe otro, pero ¿cuál se genera en R.java para nosotros?

+2

De los documentos: Una ID no necesita ser única en todo el árbol, pero debe ser única dentro de la parte del árbol que está buscando (que a menudo puede ser todo el árbol, por lo que es mejor ser completamente único cuando sea posible) – Lucas

Respuesta

25

La sintaxis @+id/foo se agregará si la identificación no existe o usa la identificación existente.
Cuando encuentre ViewById, operará en la vista en la que llama al método.

Por lo tanto, si ha anidado las vistas, su id. Será único para cada vista. p. View1 -> View2 ambos tienen foo. View1.findViewById(R.id.foo) será diferente de View2.findViewById(R.id.foo)

editar: Supongo que lo principal es que dos diseños no pueden tener la misma identificación. Para obtener más información sobre la restricción de Identificación: http://d.android.com/guide/topics/ui/declaring-layout.html

+3

El segundo punto es especialmente importante si usa includes, ya que volver a utilizar el mismo diseño con include a menudo dará como resultado que se usen los mismos ID en múltiples ramas del árbol de View. –

+0

¿Esto significa que R.java actúa solo como contenedor de nombre? ¿Qué sucede si declaro dos botones en dos archivos xml diferentes que tienen el mismo nombre de identificación y trato de recuperarlo en una actividad? Editar: el enlace que acaba de agregar me hace pensar que un diseño también actúa como "espacio de nombres" para los identificadores declarados dentro de él. – dgraziotin

+0

+1 para un buen punto. Actualicé mi respuesta con un enlace a la guía que menciona específicamente esto. Creo que puede ser un poco confuso para un desarrollador (especialmente un desarrollador web) que se haya acostumbrado a usar identificadores únicos para elementos en una aplicación, como elementos en una página web. –

2

Creo que simplemente reutiliza el identificador si ya se ha generado. Tiendo a reutilizar identificaciones bastante, y nunca me he encontrado con un problema.

+0

Reutiliza significa que sobrescribe la entrada en R.java si hay otra presente. ¿Cómo decide Android cuál conservar y cuál eliminar, en tiempo de compilación? – dgraziotin

+2

Esta pregunta no tiene sentido: si tienen el mismo nombre, tienen el mismo valor, y viceversa. Android no "guarda" uno o "descarta" uno. @ + id crea un identificador * si aún no existe. * –

+2

Mi pregunta nació debido a un malentendido del mecanismo de R.java: pensé que R.java contiene "punteros" para los objetos de la Vista. Ahora sé que es solo un contenedor identificador. Por lo tanto, el mecanismo @ + id es completamente lógico ahora. – dgraziotin

4

que intentaron una sencilla aplicación Hello World con el siguiente código XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

<TextView 
     android:id="@+id/textview" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="text1" 
/> 

<TextView 
     android:id="@+id/textview" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="text2" 
/> 

</LinearLayout> 

Mis dos textviews tienen el mismo ID. Se compila bien, funciona bien, renderiza ambos TextViews, y cuando hago un findViewByid() se encuentra el primero y se le aplican todas las llamadas a funciones como setText. Idealmente, la AAPT debería detectar esto, pero aparentemente no es así. No romperá algo terriblemente a menos que el programador confíe en los id. Así que es como decir: si eres lo suficientemente tonto como para escribir un código así, entonces mereces fallar.

A la AAPT no le importará demasiado. Para ello, esto es como una simple extensión de Vistas sin identificadores explícitos provistos por el programador.

+0

1 por esforzarse para probarlo y compartir los detalles. –

Cuestiones relacionadas