Déclaration d’un élément d’interface utilisateur Android personnalisé à l’aide de XML

Comment déclarer un élément d’interface utilisateur Android à l’aide de XML?

Le Guide du développeur Android contient une section intitulée Créer des composants personnalisés . Malheureusement, la discussion sur les atsortingbuts XML ne couvre que la déclaration du contrôle dans le fichier de mise en page et ne traite pas réellement les valeurs à l’intérieur de l’initialisation de la classe. Les étapes sont les suivantes:

1. Déclarez les atsortingbuts dans les values\attrs.xml

         

Notez l’utilisation d’un nom non qualifié dans la balise declare-styleable . Les atsortingbuts Android non standard comme extraInformation doivent avoir leur type déclaré. Les balises déclarées dans la superclasse seront disponibles dans des sous-classes sans avoir à être redéclarées.

2. Créer des constructeurs

Comme il existe deux constructeurs qui utilisent un AtsortingbuteSet pour l’initialisation, il convient de créer une méthode d’initialisation distincte pour les constructeurs.

 private void init(AtsortingbuteSet attrs) { TypedArray a=getContext().obtainStyledAtsortingbutes( attrs, R.styleable.MyCustomView); //Use a Log.i("test",a.getSsortingng( R.styleable.MyCustomView_android_text)); Log.i("test",""+a.getColor( R.styleable.MyCustomView_android_textColor, Color.BLACK)); Log.i("test",a.getSsortingng( R.styleable.MyCustomView_extraInformation)); //Don't forget this a.recycle(); } 

R.styleable.MyCustomView est une ressource int[] générée automatiquement, chaque élément étant l’ID d’un atsortingbut. Les atsortingbuts sont générés pour chaque propriété dans le XML en ajoutant le nom d’atsortingbut au nom de l’élément. Par exemple, R.styleable.MyCustomView_android_text contient l’atsortingbut android_text pour MyCustomView . Les atsortingbuts peuvent alors être récupérés à partir de TypedArray utilisant différentes fonctions de TypedArray . Si l’atsortingbut n’est pas défini dans le XML défini, la valeur null est renvoyée. Sauf, bien sûr, si le type de retour est une primitive, auquel cas le second argument est renvoyé.

Si vous ne souhaitez pas récupérer tous les atsortingbuts, il est possible de créer ce tableau manuellement. L’ID des atsortingbuts Android standard est inclus dans android.R.attr , tandis que les atsortingbuts de ce projet figurent dans R.attr .

 int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor}; 

S’il vous plaît noter que vous ne devriez pas utiliser quoi que ce soit dans android.R.styleable , car selon ce thread, il peut changer dans le futur. Il est toujours dans la documentation de voir toutes ces constantes au même endroit est utile.

3. Utilisez-le dans un fichier de disposition tel que layout\main.xml

Incluez la déclaration d’espace de noms xmlns:app="http://schemas.android.com/apk/res-auto" dans l’élément XML de niveau supérieur. Les espaces de noms fournissent une méthode permettant d’éviter les conflits qui surviennent parfois lorsque différents schémas utilisent les mêmes noms d’éléments (voir cet article pour plus d’informations). L’URL est simplement une manière d’identifier les schémas de manière unique – rien ne doit être hébergé sur cette URL . Si cela ne semble pas être le cas, c’est que vous n’avez pas besoin d’append le préfixe d’espace de noms, sauf si vous devez résoudre un conflit.

  

Référencez la vue personnalisée en utilisant le nom complet.

Exemple de LabelView Android

Si vous voulez un exemple complet, regardez l’exemple de vue d’étiquette Android.

LabelView.java

  TypedArray a=context.obtainStyledAtsortingbutes(attrs, R.styleable.LabelView); CharSequences=a.getSsortingng(R.styleable.LabelView_text); 

attrs.xml

      

custom_view_1.xml

  

Ceci est contenu dans un LinearLayout avec un atsortingbut d’espace de nommage: xmlns:app="http://schemas.android.com/apk/res-auto"

Liens

  • StackOverflow Thread: récupération d’un atsortingbut XML pour un contrôle personnalisé
  • Comment utiliser getStyledAtsortingbutes avec des thèmes internes d’Android
  • Définition d’atsortingbuts personnalisés + liste des formats d’atsortingbuts pris en charge

Grande référence Merci! Un ajout à cela:

Si vous avez un projet de bibliothèque inclus qui a déclaré des atsortingbuts personnalisés pour une vue personnalisée, vous devez déclarer votre espace de nom de projet, pas celui de la bibliothèque. Par exemple:

Étant donné que la bibliothèque a le package “com.example.library.customview” et que le projet de travail a le package “com.example.customview”, alors:

Ne fonctionnera pas (montre l’erreur “erreur: Aucun identificateur de ressource trouvé pour l’atsortingbut ‘newAttr’ dans le package ‘com.example.library.customview'”):

  

Marchera:

  

Ajout à la réponse la plus votée.

getStyledAtsortingbutes ()

Je veux append quelques mots sur l’utilisation de gettingStyledAtsortingbutes (), lorsque nous créons une vue personnalisée à l’aide des atsortingbuts prédéfinis Android: xxx. Surtout quand on utilise TextAppearance.
Comme mentionné dans “2. Création de constructeurs”, la vue personnalisée obtient AtsortingbuteSet lors de sa création. Utilisation principale que nous pouvons voir dans le code source TextView (API 16).

 final Resources.Theme theme = context.getTheme(); // TextAppearance is inspected first, but let observe it later TypedArray a = theme.obtainStyledAtsortingbutes( attrs, com.android.internal.R.styleable.TextView, defStyle, 0); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); // huge switch with pattern value=a.getXXX(attr) <=> a.getXXX(a.getIndex(i)) } a.recycle(); 

Que pouvons-nous voir ici?
obtainStyledAtsortingbutes(AtsortingbuteSet set, int[] attrs, int defStyleAttr, int defStyleRes)
L’ensemble d’atsortingbuts est traité par thème en fonction de la documentation. Les valeurs d’atsortingbut sont compilées étape par étape. Les premiers atsortingbuts sont remplis à partir du thème, puis les valeurs sont remplacées par les valeurs du style, et enfin les valeurs exactes du XML pour l’instance de vue spéciale en remplacent d’autres.
Tableau des atsortingbuts demandés – com.android.internal.R.styleable.TextView
C’est un tableau ordinaire de constantes. Si nous demandons des atsortingbuts standard, nous pouvons construire ce tableau manuellement.

Ce qui n’est pas mentionné dans la documentation – ordre des éléments TypedArray de résultat.
Lorsque la vue personnalisée est déclarée dans attrs.xml, des constantes spéciales pour les index d’atsortingbut sont générées. Et nous pouvons extraire des valeurs de cette façon: a.getSsortingng(R.styleable.MyCustomView_android_text) . Mais pour manuel int[] il n’y a pas de constantes. Je suppose que getXXXValue (arrayIndex) fonctionnera correctement.

Et une autre question est: “Comment pouvons-nous remplacer les constantes internes et demander des atsortingbuts standard?” Nous pouvons utiliser les valeurs android.R.attr. *.

Donc, si nous voulons utiliser l’atsortingbut TextAppearance standard dans une vue personnalisée et lire ses valeurs dans constructeur, nous pouvons modifier le code de TextView de cette façon:

 ColorStateList textColorApp = null; int textSize = 15; int typefaceIndex = -1; int styleIndex = -1; Resources.Theme theme = context.getTheme(); TypedArray a = theme.obtainStyledAtsortingbutes(attrs, R.styleable.CustomLabel, defStyle, 0); TypedArray appearance = null; int apResourceId = a.getResourceId(R.styleable.CustomLabel_android_textAppearance, -1); a.recycle(); if (apResourceId != -1) { appearance = theme.obtainStyledAtsortingbutes(apResourceId, new int[] { android.R.attr.textColor, android.R.attr.textSize, android.R.attr.typeface, android.R.attr.textStyle }); } if (appearance != null) { textColorApp = appearance.getColorStateList(0); textSize = appearance.getDimensionPixelSize(1, textSize); typefaceIndex = appearance.getInt(2, -1); styleIndex = appearance.getInt(3, -1); appearance.recycle(); } 

Où CustomLabel est défini:

         

Peut-être, je me trompe d’une certaine façon, mais la documentation Android sur gettingStyledAtsortingbutes () est très mauvaise.

Extension du composant d’interface utilisateur standard

Dans le même temps, nous pouvons simplement étendre le composant d’interface utilisateur standard, en utilisant tous ses atsortingbuts déclarés. Cette approche n’est pas très bonne, car TextView, par exemple, déclare beaucoup de propriétés. Et il sera impossible d’implémenter des fonctionnalités complètes dans override onMeasure () et onDraw ().

Mais nous pouvons sacrifier la large récupération théorique de composants personnalisés. Dites “Je sais exactement quelles fonctionnalités je vais utiliser”, et ne partagez le code avec personne.

Ensuite, nous pouvons implémenter le constructeur CustomComponent(Context, AtsortingbuteSet, defStyle) . Après avoir appelé super(...) nous aurons tous les atsortingbuts analysés et disponibles via des méthodes getter.

Il semble que Google ait mis à jour sa page de développeur et y ait ajouté diverses formations.

L’un d’eux concerne la création de vues personnalisées et peut être trouvé ici.

Merci beaucoup pour la première réponse.

En ce qui me concerne, je n’avais qu’un seul problème. En gonflant ma vue, j’ai eu un bogue: java.lang.NoSuchMethodException: MyView (Contexte, Atsortingbuts)

Je l’ai résolu en créant un nouveau constructeur:

 public MyView(Context context, AtsortingbuteSet attrs) { super(context, attrs); // some code } 

J’espère que cela aidera!

Vous pouvez inclure n’importe quel fichier de mise en page dans un autre fichier

       

ici, les fichiers de mise en page dans la balise include sont d’autres fichiers de disposition .xml dans le même dossier res.