La définition de la coutume attrs
J'ai besoin pour mettre en place mes propres attributs comme dans com.android.R.attr
Rien trouvé dans la documentation officielle, donc j'ai besoin d'informations sur la façon de définir ces attrs et comment les utiliser à partir de mon code.
- Ces documents peut être plus récents que votre post, mais afin de garder ce courant, vous pouvez trouver le bon, la documentation officielle pour les attributs ici : developer.android.com/training/custom-views/...
- Je vous recommande l'article de nice avec un exemple sur les attributs personnalisés: amcmobileware.org/android/blog/2016/09/11/custom-attributes
- un petit exemple de travail peut être utile: github.com/yujiaao/MergeLayout1
Vous devez vous connecter pour publier un commentaire.
Actuellement la meilleure documentation est la source. Vous pouvez prendre un coup d'oeil ici (attrs.xml).
Vous pouvez définir des attributs dans le top
<resources>
élément ou à l'intérieur d'un<declare-styleable>
élément. Si je vais utiliser un attribut dans plus d'un endroit, je l'ai mis dans l'élément racine. Remarque, tous les attributs de partager le même espace de noms global. Cela signifie que même si vous créez un nouvel attribut à l'intérieur d'un<declare-styleable>
élément, il peut être utilisé à l'extérieur d'elle et vous ne pouvez pas créer un autre attribut avec le même nom d'un type différent.Un
<attr>
élément possède deux attributs xmlname
etformat
.name
vous permet d'appeler quelque chose et c'est la façon dont vous finissez par renvoi dans le code, par exemple,R.attr.my_attribute
. Leformat
attribut peut avoir des valeurs différentes selon le "type" de l'attribut que vous souhaitez.Vous pouvez définir le format de plusieurs types en utilisant
|
, par exemple,format="reference|color"
.enum
attributs peuvent être définis comme suit:flag
attributs sont similaires, sauf que les valeurs doivent être définies de sorte qu'ils peuvent être peu par un ou binaire ensemble:En plus des attributs il est le
<declare-styleable>
élément. Cela vous permet de définir les attributs d'un affichage personnalisé peut utiliser. Vous faites cela en spécifiant une<attr>
élément, s'il a été précédemment défini, vous ne spécifiez pas leformat
. Si vous souhaitez réutiliser un android attr, par exemple, android:gravity, alors vous pouvez le faire dans lename
, comme suit.Un exemple d'un affichage personnalisé
<declare-styleable>
:Lors de la définition de vos attributs personnalisés en XML sur votre affichage personnalisé, vous devez faire quelques choses. Vous devez d'abord déclarer un espace de noms pour trouver vos attributs. Vous faites cela sur la racine de l'élément de mise en page. Normalement, il y a seulement
xmlns:android="http://schemas.android.com/apk/res/android"
. Vous devez maintenant ajouterxmlns:whatever="http://schemas.android.com/apk/res-auto"
.Exemple:
Enfin, pour accéder à cet attribut personnalisé vous normalement le faire dans le constructeur de votre affichage personnalisé comme suit.
La fin. 🙂
View
: github.com/commonsguy/cw-advandroid/tree/master/Views/...xmlns:my="http://schemas.android.com/apk/lib/my.namespace"
- pas de copie attrs.xml. Remarque l'URI d'espace de noms de chemin d'accès doit être /apk/*lib* pas /apk/res.<attr name="title" format="string"/>
existe dans le paquetcom.pack1
(enmodule1
) et aussi que le même attribut existe danscom.pack2
(enmodule2
) et les deux modules sont référencés dansmodule3
(exécutable). J'ai reçu le message d'erreurAttribute "title" has already been defined
.format
et leurs significations ne sont pas décrits n'importe où dans l'officiel docs? J'ai eu un bon coup d'oeil et ne peuvent pas les trouver. Semble étrange pour une caractéristique importante de l'architecture.apk/lib
astuce ne fonctionne pas pour moi sur les attributs personnalisés avec le format de référence à partir d'une bibliothèque de projet. Ce ne travail était d'utiliserapk/res-auto
, comme suggéré dans le stackoverflow.com/a/13420366/22904 juste au-dessous et aussi dans stackoverflow.com/a/10217752drawable
ouvalues
des fichiers xml?enum
etflag
: la première nous permet de choisir une et une seule valeur, ce dernier nous permet de combiner plusieurs. J'ai rédigé une longue réponse à une question similaire, ici, et ayant maintenant trouvé cette question, j'ai pensé lier.xmlns:xxxx="http://schemas.android.com/apk/res/my_package_name"
et il fonctionnea.recycle()
est très important ici de libérer de la mémoireMyCustomView(Context context, AttributeSet attrs, int defStyle)
n'était pas appelé de sorte qu'un changement deMyCustomView(Context context, AttributeSet attrs)
travaillé et utilisécontext.obtainStyledAttributes(attrs,R.styleable.MyCustomView)
pour obtenirTypedArray
.width
etheight
travailler avec des valeurs comme16dp
etmatch_parent
? Sont-ilsdimension|enum
?Qberticus la réponse est bonne, mais utile, un détail est absent. Si vous êtes à la mise en œuvre de ces dans une bibliothèque remplacer:
avec:
Sinon, l'application qui utilise la bibliothèque aura des erreurs d'exécution.
La réponse ci-dessus couvre tout, dans les moindres détails, mis à part un couple de choses.
Tout d'abord, si il n'y a pas de styles, puis le
(Context context, AttributeSet attrs)
signature de la méthode sera utilisée pour instancier la préférence. Dans ce cas, utilisez simplementcontext.obtainStyledAttributes(attrs, R.styleable.MyCustomView)
pour obtenir le TypedArray.Deuxièmement, elle ne couvre pas la façon de traiter avec plaurals ressources (quantité de chaînes de caractères). On ne peut pas être traitée avec l'aide de TypedArray. Voici un extrait de code dans mon SeekBarPreference qui définit le résumé de la préférence de la mise en forme de sa valeur en fonction de la valeur de la préférence. Si le xml pour la préférence de jeux android:résumé d'une chaîne de texte ou une chaîne de ressource de la valeur de la préférence est formaté dans la chaîne (il doit avoir, %d, pour ramasser la valeur). Si android:résumé est fixé à un plaurals ressource, qui est utilisé pour formater le résultat.
notifyChanged()
dans la préférence duonDialogClosed
méthode.L'approche traditionnelle est plein de code réutilisable et maladroit des ressources de la manipulation. C'est pourquoi j'ai pris la Spyglass cadre. Pour démontrer comment cela fonctionne, voici un exemple montrant comment faire une vue personnalisée qui affiche une Chaîne de titre.
Étape 1: Créer une vue personnalisée de classe.
Étape 2: Définir un attribut de chaîne dans le
values/attrs.xml
fichier de ressources:Étape 3: Appliquer le
@StringHandler
annotation à l'setTitle
méthode pour raconter l'Spyglass cadre de l'itinéraire de la valeur de l'attribut à cette méthode lorsque la vue est gonflé.Maintenant que votre classe a un Spyglass annotation, la Spyglass cadre de la détecter au moment de la compilation et de générer automatiquement le
CustomView_SpyglassCompanion
classe.Étape 4: Utilisation de la classe générée dans la vue personnalisée du
init
méthode:Que c'est. Maintenant, lorsque l'on instancie la classe à partir de XML, le Spyglass compagnon interprète les attributs et fait le nécessaire appel de méthode. Par exemple, si nous gonfler la mise en page suivante puis
setTitle
sera appelée avec"Hello, World!"
comme argument.Le cadre n'est pas limité aux ressources de chaîne a beaucoup de différentes annotations pour la gestion des autres types de ressources. Il dispose également d'annotations pour définir les valeurs par défaut et les passant en valeur de l'espace réservé si vos méthodes ont de multiples paramètres.
Avoir un regard sur le dépôt Github pour plus d'informations et d'exemples.
android:title="@{"Hello, world!"}"
.