web-dev-qa-db-fra.com

Android Constructeur de vue personnalisé

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

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 .

66
CommonsWare

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>
11
yanchenko