¿Puede alguien explicarme etiqueta XML declarable en este ejemplo y la teoría detrás de su uso?

Estoy leyendo Beginning Android 4 Development y en el capítulo 5 se habla de Gallery y ImageVievs e introduce la etiqueta XML declarable- sin estilo sin explicar su propósito .. He intentado encontrar alguna información también sobre la referencia, sin suerte. Tienen lo siguiente:

Res / values ​​/ attrs.xml

<?xml version=”1.0” encoding=”utf-8”?> <resources> <declare-styleable name=”Gallery1”> <attr name=”android:galleryItemBackground” /> </declare-styleable> </resources> 

Example.java

 public class GalleryActivity extends Activity { [...] public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Gallery gallery = (Gallery) findViewById(R.id.gallery1); gallery.setAdapter(new ImageAdapter(this)); [...] } [...] public class ImageAdapter extends BaseAdapter { [...] int itemBackground; public ImageAdapter(Context c) { context = c; //---setting the style--- TypedArray a = obtainStyledAttributes( R.styleable.Gallery1); itemBackground = a.getResourceId( R.styleable.Gallery1_android_galleryItemBackground, 0); a.recycle(); } public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; [...] imageView.setBackgroundResource(itemBackground); return imageView; } } } 

He leído el código unas cuantas veces y realmente no entiendo el propósito de definir este Gallery1 con estilo con un solo hijo attr con un atributo de nombre .. ¿me puede ayudar? ¿Es este galleryItemBackground algo proporcionado por el sistema o es algo definido por nosotros? ¿Qué estamos haciendo en esta pieza de código?

¡Gracias de antemano por cualquier ayuda!

Esta etiqueta es parte de un conjunto de premade Android atributos definidos en R.Styleable , que se puede decir aparte de una etiqueta personalizable personalizado desde el prefijo de espacio de nombres android: xml antes del nombre del atributo.

Este atributo particular se describe como:

El fondo preferido para los elementos de la galería. Esto debe establecerse como fondo de las vistas que proporcione desde el adaptador.

Usted tiene razón, sin embargo, que las etiquetas de atributos personalizados requerirían no sólo el nombre del atributo, sino su tipo, por ejemplo, agregar un elemento personalizado a su archivo attrs.xml podría tener este aspecto:

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyCustomView"> <attr name=”android:galleryItemBackground” /> <attr name="myCustomAttr" format="string" /> </declare-styleable> </resources> 

Tenga en cuenta la falta de la android: namespace en el segundo atributo también.

Editar:

¿Existe alguna página de documentación oficial que explique en profundidad este Styleables?

Echa un vistazo a R.attr (haga clic en el vínculo) para ver los distintos atributos incluidos en Android. No es necesario declarar un tipo para ellos, porque ya están todos declarados. Para saber qué tipo se ha declarado para un atributo en particular, busque la descripción de la que le interesa. galleryItemBackground es, como es de esperarse, una referencia a otro recurso; Otras posibilidades son booleanos, flotadores, colores, etc.

Referencias adicionales: Andtoid utiliza la etiqueta <declare-styleable> para crear un AttributeSet . TypedArray se utiliza para analizar el AttributeSet .

Si el propósito del código […] anterior es simplemente obtener un Drawable predeterminado para el fondo de la vista, ¿no podría establecer la variable itemBackground con getDrawable (android.R.attr.galleryItemBackground)?

En el ejemplo, es difícil ver la utilidad de este patrón cuando sólo hay un atributo. Puedes hacer lo que pides, y puede ser más fácil. El constructo, sin embargo, es parte del mantra de Android para separar la "apariencia" de la interfaz de usuario de su "functionaly" al permitirle establecer ciertos atributos en xml en lugar de tener que hacer todo en código. Tome la clase View , por ejemplo. Tiene más de 30 atributos que se pueden establecer en un archivo xml (tamaño, relleno, clicable, focusable, etc); Alguien que crea una subclase personalizada de View puede establecer algunos, todos o ninguno de estos atributos en xml y se manejan automáticamente cuando se crea la vista. Hay equivalentes de código para establecer los atributos si es necesario, pero imagina cada vez que subclases View tenías que establecer todos los atributos en el código en lugar de tener una opción para establecerlos en xml.

También sería una cuestión trivial hacer sólo sus propios recursos para sus clases que hacen exactamente lo mismo, sin embargo el uso de los estilos incorporados proporcionará recursos predeterminados que coincidan con el aspecto y la sensación del marco de Android si no los sobrescriben.

Espero que esto ayude.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.