web-dev-qa-db-fra.com

Comment passer des paramètres de composants personnalisés dans Java et xml

Lors de la création d'un composant personnalisé dans Android, il est souvent demandé comment créer et transmettre la propriété attrs au constructeur.

Il est souvent suggéré que lors de la création d'un composant dans Java que vous utilisez simplement le constructeur par défaut, c'est-à-dire.

new MyComponent(context);

plutôt que d'essayer de créer un objet attrs à passer au constructeur surchargé, souvent vu dans les composants personnalisés basés sur xml. J'ai essayé de créer un objet attrs et cela ne semble ni facile ni possible (sans un processus extrêmement compliqué), et par tous les comptes n'est pas vraiment nécessaire.

Ma question est alors: Quel est le moyen le plus efficace de construire un composant personnalisé dans Java qui transmet ou définit des propriétés qui auraient autrement été définies par l'objet attrs lors du gonflage d'un composant en utilisant xml?

49
Emile

(Divulgation complète: cette question est une émanation de Création d'une vue personnalisée )

Vous pouvez créer des constructeurs au-delà des trois standards hérités de View qui ajoutent les attributs que vous souhaitez ...

MyComponent(Context context, String foo)
{
  super(context);
  // Do something with foo
}

... mais je ne le recommande pas. Il vaut mieux suivre la même convention que les autres composants. Cela rendra votre composant aussi flexible que possible et empêchera les développeurs utilisant votre composant de vous arracher les cheveux parce que le vôtre est incompatible avec tout le reste:

1. Fournissez des getters et setters pour chacun des attributs:

public void setFoo(String new_foo) { ... }
public String getFoo() { ... }

2. Définissez les attributs dans res/values/attrs.xml afin qu'ils puissent être utilisés en XML.

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="MyComponent">
    <attr name="foo" format="string" />
  </declare-styleable>
</resources>

3. Fournissez les trois constructeurs standard de View.

Si vous devez sélectionner quoi que ce soit dans les attributs d'un des constructeurs qui prend un AttributeSet, vous pouvez le faire ...

TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MyComponent);
CharSequence foo_cs = arr.getString(R.styleable.MyComponent_foo);
if (foo_cs != null) {
  // Do something with foo_cs.toString()
}
arr.recycle();  // Do this when done.

Avec tout cela fait, vous pouvez instancier MyCompnent par programme ...

MyComponent c = new MyComponent(context);
c.setFoo("Bar");

... ou via XML:

<!-- res/layout/MyActivity.xml -->
<LinearLayout
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  xmlns:blrfl="http://schemas.Android.com/apk/res-auto"
  ...etc...
>
  <com.blrfl.MyComponent
   Android:id="@+id/customid"
   Android:layout_weight="1"
   Android:layout_width="fill_parent"
   Android:layout_height="fill_parent"
   Android:layout_gravity="center"
   blrfl:foo="bar"
   blrfl:quux="bletch"
  />
</LinearLayout>

Ressource supplémentaire - https://developer.Android.com/training/custom-views/create-view

95
Blrfl