J'apprends d'utiliser des vues personnalisées à partir de ce qui suit:
http://developer.android.com/guide/topics/ui/custom-components.html#modification
La description dit:
Initialisation de classe comme toujours, le Super s'appelle d'abord. De plus, ce n'est pas un constructeur par défaut, mais un paramétré. L'EditText est créé avec ces paramètres lorsqu'il est gonflé à partir d'un fichier de présentation XML, notre constructeur doit également les prendre et les transmettre au constructeur de Superclass.
Y a-t-il une meilleure description? J'ai essayé de déterminer ce que le constructeur devrait ressembler et j'ai proposé 4 choix possibles (voir exemple à la fin du poste). Je ne sais pas ce que ces 4 choix font (ou ne le font pas), pourquoi je devrais les implémenter, ou ce que les paramètres signifient. Y a-t-il une description de ceux-ci?
public MyCustomView()
{
super();
}
public MyCustomView(Context context)
{
super(context);
}
public MyCustomView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public MyCustomView(Context context, AttributeSet attrs, Map params)
{
super(context, attrs, params);
}
Vous n'avez pas besoin du premier, car cela ne fonctionnera tout simplement pas.
Le troisième signifiera que votre personnalisation View
sera utilisable à partir de fichiers de mise en page XML. Si vous ne vous souciez pas de cela, vous n'en avez pas besoin.
Le quatrième n'est faux, Afaik. Il n'y a pas de constructeur View
prenant un Map
comme troisième paramètre. Il y en a un qui prend un int
comme troisième paramètre, utilisé pour remplacer le style par défaut du widget.
J'ai tendance à utiliser la syntaxe this()
Syntaxe pour les combiner:
public ColorMixer(Context context) {
this(context, null);
}
public ColorMixer(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ColorMixer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// real work here
}
Vous pouvez voir le reste de ce code dans cet exemple de livre .
Voici un mon modèle (créant une personnalité ViewGoup
ici, mais toujours):
// CustomView.Java
public class CustomView extends LinearLayout {
public CustomView(Context context) {
super(context);
init(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public CustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context ctx) {
LayoutInflater.from(ctx).inflate(R.layout.view_custom, this, true);
// extra init
}
}
et
// view_custom.xml
<merge xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- Views -->
</merge>