28 votes

Constructeur de vue personnalisée Android

J'apprends à utiliser les vues personnalisées à partir de ce qui suit :

http://developer.Android.com/guide/topics/ui/custom-components.html#modifying

La description dit :

Initialisation de la classe Comme toujours, le super est appelé en premier. De plus, ce n'est pas un constructeur par défaut, mais mais un constructeur paramétré. L'EditText est créé avec ces paramètres lorsqu'il est est gonflé à partir d'un fichier de mise en page XML, donc, notre constructeur doit à la fois les prendre et les passer au constructeur de la superclasse également.

Existe-t-il une meilleure description ? J'ai essayé de comprendre à quoi devrait ressembler le(s) constructeur(s) et j'ai trouvé 4 choix possibles (voir l'exemple à la fin du post). Je ne suis pas sûr de ce que ces 4 choix font (ou ne font pas), pourquoi je devrais les implémenter, ou ce que les paramètres signifient. Existe-t-il une description de ces paramètres ?

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);
}

56voto

CommonsWare Points 402670

Vous n'avez pas besoin de la première, car elle ne fonctionnera pas.

Le troisième signifie que vous êtes personnalisé 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 est tout simplement faux, AFAIK. Il n'y a pas de View qui prennent 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 le 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 .

10voto

yanchenko Points 24142

Voici un de mes modèles (création d'une ViewGoup ici, mais quand même) :

// 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>

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