Question

J'apprends sur l'utilisation de vues personnalisées de ce qui suit:

http://developer.android.com/guide/ sujets / ui / custom-components.html # modification

La description dit:

  

Initialisation de classe Comme toujours, le   super est appelé en premier. En outre,   ce n'est pas un constructeur par défaut, mais   un paramétrés une. Le EditText est   créé avec ces paramètres quand il   est gonflé à partir d'un fichier de mise en page XML,   ainsi, notre constructeur doit à la fois   les prendre et de les transmettre à la   constructeur de superclasse ainsi.

Y at-il une meilleure description? J'ai essayé de comprendre ce que le constructeur (s) devrait ressembler et je suis venu avec 4 choix possibles (voir exemple à la fin de post). Je ne sais pas ce que ces 4 choix font (ou ne font pas), pourquoi je devrais les mettre en œuvre, ou ce que les paramètres signifient. Y at-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);
} 
Était-ce utile?

La solution

Vous n'avez pas besoin le premier, car ce ne va pas fonctionner.

Le troisième signifiera votre View personnalisé sera utilisable à partir des fichiers de mise en page XML. Si vous ne se soucient pas de cela, vous n'avez pas besoin.

Le quatrième est tout simplement faux, autant que je sache. Il n'y a pas de constructeur de View qui prennent un Map comme le troisième paramètre. Il est celui qui prend un int comme le troisième paramètre, utilisé pour remplacer le style par défaut pour le widget.

J'ai tendance à utiliser la syntaxe this() de 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 .

Autres conseils

Voici un mon modèle (la création d'un ViewGoup personnalisé 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>

Lorsque vous ajoutez votre View personnalisé à partir xml comme:

 <com.mypack.MyView
      ...
      />

vous aurez besoin du constructeur public MyView(Context context, AttributeSet attrs), sinon vous obtiendrez un Exception quand Android essaie de inflate votre View.

Et quand vous ajoutez votre View de xml et aussi spécifiez android:style de attribute comme:

 <com.mypack.MyView
      style="@styles/MyCustomStyle"
      ...
      />

vous aurez également besoin du troisième constructeur public MyView(Context context, AttributeSet attrs,int defStyle).

Le troisième constructeur est généralement utilisé lorsque vous étendez un style et le personnaliser, et alors vous souhaitez définir cette style à un View donné dans vos mises en page

Modifier Détails

public MyView(Context context, AttributeSet attrs) {
            //Called by Android if <com.mypack.MyView/> is in layout xml file without style attribute.
            //So we need to call MyView(Context context, AttributeSet attrs, int defStyle) 
            // with R.attr.customViewStyle. Thus R.attr.customViewStyle is default style for MyView.
            this(context, attrs, R.attr.customViewStyle);
    }

Voir cette

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top