155 votes

Ai-je besoin des trois constructeurs pour une vue personnalisée Android ?

Lors de la création d'une vue personnalisée, j'ai remarqué que de nombreuses personnes semblent procéder de la manière suivante :

public MyView(Context context) {
  super(context);
  // this constructor used when programmatically creating view
  doAdditionalConstructorWork();
}

public MyView(Context context, AttributeSet attrs) {
  super(context, attrs);
  // this constructor used when creating view through XML
  doAdditionalConstructorWork();
}

private void doAdditionalConstructorWork() {

  // init variables etc.
}

Ma première question est, qu'en est-il du constructeur MyView(Context context, AttributeSet attrs, int defStyle) ? Je ne sais pas où il est utilisé, mais je le vois dans la super classe. En ai-je besoin, et où est-il utilisé ?

Il y a une autre partie à cette question .

-2voto

arTsmarT Points 96

Si vous devez inclure trois constructeurs comme celui dont nous discutons maintenant, vous pouvez aussi le faire.

public MyView(Context context) {
  this(context,null,0);
}

public MyView(Context context, AttributeSet attrs) {
  this(context,attrs,0);
}

public MyView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  doAdditionalConstructorWork();

}

2 votes

@Jin C'est une bonne idée dans de nombreux cas, mais c'est également sûr dans de nombreux cas (ex : RelativeLayout, FrameLayout, RecyclerView, etc.). Donc, je dirais que c'est probablement une exigence au cas par cas et la classe de base devrait être vérifiée avant de prendre la décision de cascader ou non. Essentiellement, si le constructeur à 2 paramètres de la classe de base appelle simplement this(context, attrs, 0), alors il est sûr de le faire aussi dans la classe de vue personnalisée.

0 votes

@IanWong, bien sûr, elle sera appelée, car les première et deuxième méthodes appellent la troisième.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X