Qu'est-ce que AttributeSet dans Android?
Comment puis-je l'utiliser pour ma vue personnalisée?
Une réponse tardive, bien que détaillée, pour les autres.
AttributeSet (Android Docs)
Une collection d'attributs, associée à une balise dans un document XML.
En gros, si vous essayez de créer une vue personnalisée et que vous souhaitez transmettre des valeurs telles que des dimensions, des couleurs, etc., vous pouvez le faire avec AttributeSet
.
Imaginez que vous vouliez créer une View
comme ci-dessous
Il y a un rectangle avec un fond jaune et un cercle à l'intérieur, avec un rayon de 5dp et un fond vert. Si vous souhaitez que vos vues prennent les valeurs de couleurs d’arrière-plan et de rayon par XML, comme ceci:
<com.anjithsasindran.RectangleView
app:radiusDimen="5dp"
app:rectangleBackground="@color/yellow"
app:circleBackground="@color/green" />
Eh bien, c'est là que AttributeSet
est utilisé. Vous pouvez avoir ce fichier attrs.xml
dans le dossier de valeurs, avec les propriétés suivantes.
<declare-styleable name="RectangleViewAttrs">
<attr name="rectangle_background" format="color" />
<attr name="circle_background" format="color" />
<attr name="radius_dimen" format="dimension" />
</declare-styleable>
Puisqu'il s'agit d'une vue, la classe Java s'étend de View
public class RectangleView extends View {
public RectangleView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.RectangleViewAttrs);
mRadiusHeight = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_radius_dimen, getDimensionInPixel(50));
mCircleBackgroundColor = attributes.getDimensionPixelSize(R.styleable.RectangleViewAttrs_circle_background, getDimensionInPixel(20));
mRectangleBackgroundColor = attributes.getColor(R.styleable.RectangleViewAttrs_rectangle_background, Color.BLACK);
attributes.recycle()
}
}
Nous pouvons donc maintenant utiliser ces propriétés pour notre RectangleView
dans votre présentation xml, et nous obtiendrons ces valeurs dans le constructeur RectangleView
.
app:radius_dimen
app:circle_background
app:rectangle_background
AttributeSet est l'ensemble des propriétés spécifiées dans un fichier de ressources xml. Vous ne devriez rien faire de spécial dans votre vue personnalisée. La View(Context context, AttributeSet attrs)
est appelée pour initialiser une vue à partir d'un fichier de présentation. Ajoutez simplement ce constructeur à votre vue personnalisée. Consultez le Vue personnalisée exemple dans le SDK pour le voir utilisé.
Vous pouvez utiliser AttributeSet pour obtenir des valeurs personnalisées supplémentaires pour votre vue, que vous définissez dans le xml. Par exemple. Il y a un tutoriel sur Définition d'attributs personnalisés qui stipule "il est possible de lire les valeurs directement dans AttributeSet", mais cela ne dit pas comment faire cela. Cependant, il vous avertit que si vous n'utilisez pas les attributs styled, alors:
Si vous voulez ignorer la totalité des attributs de style et obtenir directement les attributs:
exemple.xml
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:custom="http://www.chooseanything.org">
<com.example.CustomTextView
Android:text="Blah blah blah"
custom:myvalue="I like cheese"/>
</LinearLayout>
Notez qu'il existe deux lignes de xmlns (xmlns = espace de noms XML), la seconde est définie comme xmlns: custom. Puis en dessous de cette coutume: ma valeur est définie.
CustomTextView.Java
public CustomTextView( Context context, AttributeSet attrs )
{
super( context, attrs );
String sMyValue = attrs.getAttributeValue( "http://www.chooseanything.org", "myvalue" );
// Do something useful with sMyValue
}
Lorsqu'une vue est créée à partir d'une présentation XML, tous les attributs de la balise XML sont lus à partir du groupe de ressources et transmis au constructeur de la vue en tant que AttributeSet
.
Bien qu'il soit possible de lire les valeurs de la variable AttributeSet
directly, cela présente toutefois certains inconvénients:
Passez plutôt AttributeSet
à obtainStyledAttribute()
. Cette méthode renvoie le tableau TypedArray
de valeurs qui ont été différées et stylisées.