web-dev-qa-db-fra.com

Android - interface utilisateur personnalisée avec attributs personnalisés

Je sais qu'il est possible de créer un élément d'interface utilisateur personnalisé (via View ou une extension d'élément d'interface utilisateur spécifique). Mais est-il possible de définir de nouvelles propriétés ou attributs pour les éléments d'interface utilisateur nouvellement créés (je veux dire non hérité, mais tout nouveau pour définir un comportement spécifique que je ne suis pas capable de gérer avec des propriétés ou des attributs par défaut)

par exemple. élément mon élément personnalisé:

<com.tryout.myCustomElement
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:text="Element..."
   Android:myCustomValue=<someValue>
/>

Donc, est-il possible de définir MyCustomValue?

THX

108
Waypoint

Oui. Petit guide:

1. Créer un attribut XML

Créez un nouveau fichier XML dans /res/values/attrs.xml, Avec l'attribut et son type

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <declare-styleable name="MyCustomElement">
        <attr name="distanceExample" format="dimension"/>
    </declare-styleable>
</resources>

Fondamentalement, vous devez configurer un <declare-styleable /> Pour votre vue qui contient tous vos attributs personnalisés (ici un seul). Je n'ai jamais trouvé une liste complète des types possibles, vous devez donc en rechercher la source, je suppose. Les types que je connais sont référence (à une autre ressource), couleur, booléen, dimension, float, entier et chaîne. Ils sont assez explicites

2. Utilisez les attributs dans votre mise en page

Cela fonctionne de la même manière que ci-dessus, à une exception près. Votre attribut personnalisé a besoin de son propre espace de noms XML.

<com.example.yourpackage.MyCustomElement
   xmlns:customNS="http://schemas.Android.com/apk/res/com.example.yourpackage"
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:text="Element..."
   customNS:distanceExample="12dp"
   />

Assez simple.

3. Utilisez les valeurs que vous avez transmises

Modifiez le constructeur de votre vue personnalisée pour analyser les valeurs.

public MyCustomElement(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyCustomElement, 0, 0);
    try {
        distanceExample = ta.getDimension(R.styleable.MyCustomElement_distanceExample, 100.0f);
    } finally {
        ta.recycle();
    }
    // ...
}

distanceExample est une variable membre privée dans cet exemple. TypedArray a eu beaucoup d'autres choses pour analyser d'autres types de valeurs.

Et c'est tout. Utilisez la valeur analysée dans votre View pour la modifier, par exemple. utilisez-le dans onDraw() pour modifier l'apparence en conséquence.

252
user658042

Dans votre dossier res/values, créez attr.xml. Là, vous pouvez définir vos attributs:

<declare-styleable name="">
    <attr name="myCustomValue" format="integer/boolean/whatever" />
</declare-styleable>

Lorsque vous voulez ensuite l'utiliser dans votre fichier de mise en page, vous devez ajouter

xmlns:customname="http://schemas.Android.com/apk/res/your.package.name"

et alors vous pouvez utiliser la valeur avec customname:myCustomValue=""

19
Maria Neumayer