Comment déclarer un élément d'interface utilisateur Android à l'aide de XML?
xml
android
user-interface
Casebash
la source
la source
Réponses:
Le Guide du développeur Android comporte une section intitulée Création de composants personnalisés . Malheureusement, la discussion sur les attributs XML ne couvre que la déclaration du contrôle dans le fichier de mise en page et non la gestion des valeurs dans l'initialisation de la classe. Les étapes sont les suivantes:
1. Déclarez les attributs dans
values\attrs.xml
Notez l'utilisation d'un nom non qualifié dans la
declare-styleable
balise. Les attributs Android non standard comme leextraInformation
besoin de déclarer leur type. Les balises déclarées dans la superclasse seront disponibles dans les sous-classes sans avoir à être redéclarées.2. Créer des constructeurs
Puisqu'il y a deux constructeurs qui utilisent un
AttributeSet
pour l'initialisation, il est pratique de créer une méthode d'initialisation distincte pour les constructeurs à appeler.R.styleable.MyCustomView
est uneint[]
ressource autogénérée où chaque élément est l'ID d'un attribut. Les attributs sont générés pour chaque propriété dans le XML en ajoutant le nom d'attribut au nom de l'élément. Par exemple,R.styleable.MyCustomView_android_text
contient l'android_text
attribut pourMyCustomView
. Les attributs peuvent ensuite être récupérés à l'TypedArray
aide de diversesget
fonctions. Si l'attribut n'est pas défini dans le défini dans le XML, ilnull
est renvoyé. Sauf, bien sûr, si le type de retour est une primitive, auquel cas le deuxième argument est renvoyé.Si vous ne souhaitez pas récupérer tous les attributs, il est possible de créer ce tableau manuellement. L'ID pour les attributs Android standard est inclus dans
android.R.attr
, tandis que les attributs pour ce projet sont dansR.attr
.Veuillez noter que vous ne devez rien utiliser dans
android.R.styleable
, selon ce fil, cela pourrait changer à l'avenir. Il est toujours dans la documentation car il est utile de visualiser toutes ces constantes au même endroit.3. Utilisez-le dans des fichiers de mise en page tels 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 pour éviter les conflits qui se produisent parfois lorsque différents schémas utilisent les mêmes noms d'élément (voir cet article pour plus d'informations). L'URL est simplement une manière d'identifier de manière unique les schémas - rien n'a réellement besoin d'être hébergé sur cette URL . Si cela ne semble rien faire, c'est parce que vous n'avez pas réellement besoin d'ajouter 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 Android LabelView
Si vous voulez un exemple complet, regardez l'exemple de vue d'étiquette Android.
LabelView.java
attrs.xml
custom_view_1.xml
Il est contenu dans un
LinearLayout
avec un attribut namespace:xmlns:app="http://schemas.android.com/apk/res-auto"
Liens
la source
Grande référence. Merci! Un ajout à cela:
S'il vous arrive d'avoir un projet de bibliothèque inclus qui a déclaré des attributs personnalisés pour une vue personnalisée, vous devez déclarer votre espace de noms 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 (affiche l'erreur "error: Aucun identifiant de ressource trouvé pour l'attribut 'newAttr' dans le package 'com.example.library.customview'"):
Marchera:
la source
xmlns:app="http://schemas.android.com/apk/res-auto"
Voir commentaire 57 code.google.com/p/android/issues/detail?id=9656Suspicious namespace: Did you mean http://schemas.android.com/apk/res-auto
res-auto
parce que nous utilisons Android Studio et Gradle. Sinon (par exemple certaines versions d'Eclipse), cela se terminerait généralement parlib/[your package name]
. iehttp://schemas.android.com/apk/lib/[your package name]
Ajout à la réponse la plus votée.
getStyledAttributes ()
Je veux ajouter quelques mots à propos de l'utilisation de obtenezStyledAttributes (), lorsque nous créons une vue personnalisée en utilisant des attributs prédéfinis android: xxx. Surtout lorsque nous utilisons TextAppearance.
Comme mentionné dans «2. Création de constructeurs», la vue personnalisée obtient AttributeSet lors de sa création. Utilisation principale que nous pouvons voir dans le code source TextView (API 16).
Que pouvons-nous voir ici?
obtainStyledAttributes(AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)
L'ensemble d'attributs est traité par thème selon la documentation. Les valeurs d'attribut sont compilées étape par étape. Les premiers attributs sont remplis à partir du thème, puis les valeurs sont remplacées par des valeurs à partir du style, et enfin les valeurs exactes de XML pour une instance de vue spéciale remplacent les autres.
Tableau d'attributs demandés -
com.android.internal.R.styleable.TextView
Il s'agit d'un tableau ordinaire de constantes. Si nous demandons des attributs standard, nous pouvons construire ce tableau manuellement.
Ce qui n'est pas mentionné dans la documentation - ordre des éléments TypedArray résultants.
Lorsque la vue personnalisée est déclarée dans attrs.xml, des constantes spéciales pour les index d'attribut sont générées. Et nous pouvons extraire des valeurs de cette façon:
a.getString(R.styleable.MyCustomView_android_text)
. Mais pour le manuelint[]
il n'y a pas de constantes. Je suppose que getXXXValue (arrayIndex) fonctionnera bien.Et une autre question est: "Comment pouvons-nous remplacer les constantes internes et demander des attributs standard?" Nous pouvons utiliser les valeurs android.R.attr. *.
Donc, si nous voulons utiliser l'attribut TextAppearance standard dans la vue personnalisée et lire ses valeurs dans le constructeur, nous pouvons modifier le code de TextView de cette façon:
Où CustomLabel est défini:
Peut-être que je me trompe d'une manière ou d'une autre, mais la documentation Android sur obtenezStyledAttributes () est très pauvre.
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 attributs déclarés. Cette approche n'est pas si bonne, car TextView, par exemple, déclare beaucoup de propriétés. Et il sera impossible d'implémenter toutes les fonctionnalités dans onMeasure () et onDraw () remplacés.
Mais nous pouvons sacrifier une large réutilisation théorique du composant personnalisé. Dites «je sais exactement quelles fonctionnalités j'utiliserai» et ne partagez pas le code avec qui que ce soit.
Ensuite, nous pouvons implémenter le constructeur
CustomComponent(Context, AttributeSet, defStyle)
. Après l'appelsuper(...)
, tous les attributs seront analysés et disponibles via les méthodes getter.la source
Il semble que Google ait mis à jour sa page développeur et y ait ajouté diverses formations.
L'un d'eux traite de la création de vues personnalisées et peut être trouvé ici
la source
Merci beaucoup pour la première réponse.
Quant à moi, je n'ai eu qu'un seul problème avec ça. Lors du gonflage de ma vue, j'ai eu un bug: java.lang.NoSuchMethodException: MyView (Context, Attributes)
Je l'ai résolu en créant un nouveau constructeur:
J'espère que cela vous aidera!
la source
Vous pouvez inclure n’importe quel fichier de mise en page dans un autre fichier de mise en page.
ici, les fichiers de disposition dans la balise include sont d'autres fichiers de disposition .xml dans le même dossier res.
la source