2012-04-04 14 views
32

En Android R.java se utiliza para proporcionar acceso a recursos definidos en archivos XML. Para acceder al recurso necesitamos invocar el método findViewById() pasando el id del recurso que se va a buscar.¿Cuál es el concepto detrás de R.java?

Esto es similar a Spring, donde los beans se definen en un contexto XML y se obtienen utilizando el contexto de la aplicación. context.getBean("beanId")

Esto proporciona un acoplamiento flojo ya que los granos están definidos externamente y podrían cambiarse sin modificar el código.

Esto me tiene confundido. Aunque lo que hace Android parece similar a la primavera, ¿qué ventaja ofrece?

  1. ¿Cuál es el punto de tener un R.java intermedia de todos modos? ¿No podríamos simplemente adquirir recursos directamente de XML mediante el uso de un recurso contexto de lector/aplicación. p.ej. findViewById("resourceId")
  2. No hay ningún acoplamiento flojo. Como las referencias en R.java se generan automáticamente, ¿cómo se puede eliminar un recurso y poner uno nuevo?
  3. ¿Qué patrón de diseño sigue (si hay uno)?
  4. ¿No sería mejor tener recursos inyectados usando IOC (como Roboguice)? ¿Por qué entonces Google decidió darnos tal una manera extraña de trabajar con recursos?

Pardon my ignorance. Soy un desarrollador Java novato que intenta demasiadas cosas a la vez. :-) Gracias por todos los comentarios.

+0

Quiero subir mi pregunta dos veces, esta es una pregunta muy interesante – fatiDev

Respuesta

18

android.R.java no es sólo el que se almacenan los identificadores de XML. También contiene acceso a los recursos, como elementos dibujables, diseños, cadenas, matrices y básicamente todo lo que puede declarar en recursos.

Personalmente creo que es útil cuando se usa Eclipse. Simplemente puedo escribir findViewById(R.id. y Eclipse mostrará una información sobre herramientas con una lista de opciones para elegir.

Sin embargo, a nivel de plataforma, diría que las variables de identificación codificadas ayudan a evitar errores cuando se utilizan cadenas para identificar recursos, algo que se puede depurar durante la programación (o durante la compilación, en lugar del tiempo de ejecución).

+5

No podría estar más de acuerdo. Creo que el tiempo de compilación hace que valga la pena. Compilar la seguridad del tiempo es una de las razones por las que amo Java sobre otros lenguajes dinámicos. :-) –

1

La comparación se siente un tanto un poco (en realidad) raro, porque se comparan dos mecanismos basados ​​en el hecho de que utilizan cosas nombradas para hacer cosas. Para la carga de recursos, por ejemplo, eche un vistazo a cómo se hace el manejo de recursos en el mundo .Net.


Prevé tiempo de compilación comprobar si el recurso está disponible. Porque si no, no habrá un estático dentro de R.java que lo señale. En el ejemplo de Spring, ¿cómo puede estar seguro de que hay un bean llamado beanId? Sin embargo, no permite verificar si es el tipo de recurso.

¿Por qué no está suelto? Siempre que el nuevo recurso tenga el mismo nombre, generará la misma constante estática. En Spring, deberías usar el mismo nombre de bean.

¿Patrón de diseño? Ninguna. Simplemente agrega un nivel de direccionamiento indirecto nombrando los recursos y luego se refiere a ellos solo por el nombre, no cargándolos directamente desde su ubicación verdadera.

En realidad, los recursos son inyectados, porque la carga de recursos debe hacer frente a la localización. Consulte here para saber cómo Android hace cosas; en el mundo .Net, las culturas adicionales se empaquetan en ensamblajes satelitales; el resource manager cargará el correcto basado en la cultura actual.

21

La mayor ventaja está en la localización y en la provisión de recursos alternativos para diferentes tamaños de pantalla.

por ejemplo, puede tener un recurso de cadena R.string.myname esto podría ser un definido en Inglés en /values-en/strings.xml y en español en /values-es/strings.xml

sistema se preocupa o recoger el archivo correcto en función de la configuración regional sólo tiene que utilizar @string/myname en su archivo de diseño o R.string.myname en su código.

mismo modo que podría tener dos archivos de diseño para el retrato y el paisaje definidas en

res/layout/mylayout.xml 
res/layout-land/mylayout.xml 

En el código que acaba especificará R.layout.mylayout para inflar el diseño. El administrador de recursos recoge el archivo en layout-land si el dispositivo está en modo apaisado.

Hacer esto manualmente sería una pesadilla - de ahí la necesidad de archivo de R

0

También contiene el acceso a los recursos - como la identificación, dibujables, diseños, cadenas, matrices y básicamente todo lo que se puede declarar en recursos .

+1

Gracias por contribuir a StackOverflow. Considere leer la entrada [Centro de ayuda] (http://stackoverflow.com/help/how-to- answer) sobre cómo responder una pregunta. Como está escrito, su respuesta no es una respuesta completa en sí misma. Se refiere al contexto de otras preguntas. Considere hacer una lista completa de lo que hay en R.java, no solo las cosas que otros carteles omiten. –

Cuestiones relacionadas