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

113

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 les propriétés ou 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>
/>

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

THX

Waypoint
la source
Salut, vous avez un bel article sur les attributs personnalisés dans Android - amcmobileware.org/android/blog/2016/09/11/custom-attributes
Arkadiusz Cieśliński
Jetez un œil à ma réponse sur cette question connexe.
Helios

Réponses:

258

Oui. Petit guide:

1. Créez un attribut XML

Créez un nouveau fichier XML à l'intérieur /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 en 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 un, je suppose. Les types que je connais sont la référence (à une autre ressource), la couleur, le booléen, la dimension, le flottant, l'entier et la chaîne . Ils sont assez explicites

2. Utilisez les attributs de votre mise en page

Cela fonctionne de la même manière que vous l'avez fait 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();
    }
    // ...
}

distanceExampleest une variable de membre privé dans cet exemple. TypedArrayj'ai beaucoup d'autres choses pour analyser d'autres types de valeurs.

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

uthark
la source
7
Remarquez simplement TypedArray. Assurez-vous d'appeler recycle () lorsque vous en avez terminé avec eux.
zskalnik
Ici vous pouvez trouver une bonne liste github.com/android/platform_frameworks_base/blob/master/core/…
yahya
L'EDI (eclipse par exemple) complète-t-il automatiquement les clés / valeurs des attributs personnalisés?
AlikElzin-kilaka
23
pour les builds gradle, vous devez utiliser http://schemas.android.com/apk/res-autolors de la déclaration de l'espace de noms personnalisé
Dori
2
À l'étape 3, vous pouvez simplement utiliser String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");où attr est le AttributeSet qui est passé dans le constructeur et 'initialText' est votre nom d'attribut personnalisé
kosiara - Bartosz Kosarzycki
21

Dans votre dossier res / values, créez attr.xml. Vous pouvez y définir vos attributs:

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

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

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

puis vous pouvez utiliser la valeur avec customname:myCustomValue=""

Maria Neumayer
la source
ce n'est pas la réponse, la question est de savoir comment changer par programme de java
Fazal
-11

Oui, vous pouvez, utilisez simplement le <resource>tag.
comme ça:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>

lien depuis le site officiel

Frank Cheng
la source
Merci de répondre. Mais dans la ressource, je vois utiliser les valeurs par défaut "android:". Mon point est, puis-je avoir par exemple android: phoneNameSelected = "true" comme paramètre de mon élément d'interface utilisateur personnalisé?
Waypoint