MyView(Contexte)
Utilisé lors de l'instanciation programmatique des vues.
MyView(Contexte, AttributeSet attrs)
Utilisé par le LayoutInflater
pour appliquer des attributs xml. Si l'un de ces attributs est nommé style
Dans le cas d'un style, les attributs seront recherchés dans le style avant de rechercher des valeurs explicites dans le fichier xml de présentation.
MyView(Context context, AttributeSet attrs, int defStyleAttr)
Supposons que vous souhaitiez appliquer un style par défaut à tous les widgets sans avoir à spécifier style
dans chaque fichier de mise en page. Par exemple, faites en sorte que toutes les cases à cocher soient roses par défaut. Vous pouvez le faire avec defStyleAttr et le framework recherchera le style par défaut dans votre thème.
Notez que defStyleAttr
a été incorrectement nommé defStyle
il y a quelque temps et la question de savoir si ce constructeur est vraiment nécessaire ou non fait l'objet de discussions. Voir https://code.google.com/p/Android/issues/detail?id=12683
MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
Le troisième constructeur fonctionne bien si vous avez le contrôle sur le thème de base des applications. Cela fonctionne pour google car ils livrent leurs widgets avec les thèmes par défaut. Mais supposons que vous écriviez une bibliothèque de widgets et que vous vouliez qu'un style par défaut soit défini sans que vos utilisateurs aient besoin de modifier leur thème. Vous pouvez maintenant le faire en utilisant defStyleRes
en lui donnant la valeur par défaut dans les deux premiers constructeurs :
public MyView(Context context) {
super(context, null, 0, R.style.MyViewStyle);
init();
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs, 0, R.style.MyViewStyle);
init();
}
Tout compte fait
Si vous implémentez vos propres vues, seuls les deux premiers constructeurs devraient être nécessaires et peuvent être appelés par le framework.
Si vous voulez que vos vues soient extensibles, vous pouvez implémenter le 4ème constructeur pour les enfants de votre classe afin de pouvoir utiliser un style global.
Je ne vois pas de réel cas d'utilisation pour le 3ème constructeur. Peut-être un raccourci si vous ne fournissez pas un style par défaut pour votre widget mais que vous voulez quand même que vos utilisateurs puissent le faire. Cela ne devrait pas arriver si souvent.