¿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
- Creación de estilo predeterminado con atributos personalizados
- Obtener atributos con estilo para el niño de la definición de estilo de los padres
- Tema de un selector dibujable en pre-Lollipop
- ¿Cómo puedo agregar selectableItemBackground a un ImageButton mediante programación?
- Cómo obtener un enum que se crea en attrs.xml en el código
<?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!
- Utilice declare styleable para configurar el tipo de entrada de componente personalizado
- GetDrawable () en TypedArray devolver null?
- Problema de espacio de nombres de control personalizado de Android
- ¿Cómo agregar documentación a atributos personalizados?
- ¿Cómo referenciar un control de otro durante la inflación?
- Establecer switchStyle - obtener error recurso no encontrado - ¿por qué?
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.