web-dev-qa-db-fra.com

Qu'est-ce que AttributeSet et comment puis-je l'utiliser?

Qu'est-ce que AttributeSet dans Android?

Comment puis-je l'utiliser pour ma vue personnalisée?

67
Premier

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

Voici un exemple

Imaginez que vous vouliez créer une View comme ci-dessous

 enter image description here

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
19
capt.swag

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é.

6
Robby Pond

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:

  • Les références de ressources dans les valeurs d'attribut ne sont pas résolues
  • Les styles ne sont pas appliqués

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
}
5
Dave

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 AttributeSetdirectly, cela présente toutefois certains inconvénients:

  • La référence de ressource dans les valeurs d'attribut n'est pas résolue
  • Les styles ne sont pas appliqués

Passez plutôt AttributeSet à obtainStyledAttribute() . Cette méthode renvoie le tableau TypedArray de valeurs qui ont été différées et stylisées. 

0
Dennis