495 votes

Définition d’attrs personnalisé

J’ai besoin de mettre en place mon propre attributs comme dans com.android.R.attr

Rien trouvé dans la documentation officielle alors j’ai besoin d’informations sur la façon de définir ces attrs et comment les utiliser à partir de mon code.

Merci

1019voto

Qberticus Points 20157

Actuellement, la meilleure documentation est la source. Vous pouvez prendre un coup d'oeil ici (attrs.xml).

Vous pouvez définir des attributs dans le top - <resources> de l'élément ou à l'intérieur d'un <declare-styleable> élément. Si je vais utiliser un attribut dans plus d'un endroit, je l'ai mis dans l'élément racine. Remarque, tous les attributs de partager le même espace de noms global. Cela signifie que même si vous créez un nouvel attribut à l'intérieur d'un <declare-styleable> élément, il peut être utilisé à l'extérieur d'elle et vous ne pouvez pas créer un autre attribut avec le même nom d'un type différent.

Un <attr> élément possède deux attributs xml name et format. name vous permet d'appeler quelque chose et c'est la façon dont vous finissez par renvoi dans le code, par exemple, R.attr.my_attribute. L' format attribut peut avoir des valeurs différentes selon le "type" de l'attribut que vous souhaitez.

  • référence - si elle fait référence à une autre ressource id e.g, "@couleur/my_color", "@mise en page/my_layout")
  • couleur
  • boolean
  • dimension
  • flotteur
  • entier
  • chaîne
  • fraction
  • enum - normalement définis implicitement
  • drapeau - normalement définis implicitement

Vous pouvez définir le format de plusieurs types en utilisant |, par exemple, format="reference|color".

enum attributs peuvent être définis comme suit:

<attr name="my_enum_attr">
  <enum name="value1" value="1" />
  <enum name="value2" value="2" />
</attr>

flag attributs sont similaires, sauf que les valeurs doivent être définies de sorte qu'ils peuvent être peu par un ou binaire ensemble:

<attr name="my_flag_attr">
  <flag name="fuzzy" value="0x01" />
  <flag name="cold" value="0x02" />
</attr>

En plus des attributs il est l' <declare-styleable> élément. Cela vous permet de définir les attributs d'un affichage personnalisé peut utiliser. Vous faites cela en spécifiant un <attr> élément, s'il a été précédemment défini, vous ne spécifiez pas l' format. Si vous souhaitez réutiliser un android attr, par exemple, android:gravity, alors vous pouvez le faire dans l' name, comme suit.

Un exemple d'une vue personnalisée <declare-styleable>:

<declare-styleable name="MyCustomView">
  <attr name="my_custom_attribute" />
  <attr name="android:gravity" />
</declare-styleable>

Lors de la définition de vos attributs personnalisés en XML sur votre affichage personnalisé, vous devez faire quelques choses. Vous devez d'abord déclarer un espace de noms pour trouver vos attributs. Vous faites cela sur la racine de l'élément de mise en page. Normalement, il y a seulement xmlns:android="http://schemas.android.com/apk/res/android". Vous devez maintenant ajouter xmlns:whatever="http://schemas.android.com/apk/res-auto".

Exemple:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:whatever="http://schemas.android.com/apk/res-auto"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

    <org.example.mypackage.MyCustomView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:gravity="center"
      whatever:my_custom_attribute="Hello, world!" />
</LinearLayout>

Enfin, pour accéder à cet attribut personnalisé vous normalement le faire dans le constructeur de votre affichage personnalisé comme suit.

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

  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyle, 0);

  String str = a.getString(R.styleable.MyCustomView_my_custom_attribute);

  //do something with str

  a.recycle();
}

La fin. :)

88voto

Neil Miller Points 584

La réponse de Qberticus est bonne, mais il manque un détail utile. Si vous les implémentez dans une bibliothèque, remplacez:

 xmlns:whatever="http://schemas.android.com/apk/res/org.example.mypackage"
 

avec:

 xmlns:whatever="http://schemas.android.com/apk/res-auto"
 

Sinon, l'application qui utilise la bibliothèque aura des erreurs d'exécution.

15voto

Steve Waring Points 209

La réponse ci-dessus couvre tout, dans les moindres détails, mis à part un couple de choses.

Tout d'abord, si il n'y a pas de styles, puis l' (Context context, AttributeSet attrs) signature de la méthode sera utilisée pour instancier la préférence. Dans ce cas il suffit d'utiliser context.obtainStyledAttributes(attrs, R.styleable.MyCustomView) pour obtenir le TypedArray.

Deuxièmement, il ne couvre pas la façon de traiter avec plaurals ressources (quantité de chaînes de caractères). On ne peut pas être traitée avec l'aide de TypedArray. Voici un extrait de code dans mon SeekBarPreference qui définit le résumé de la préférence de la mise en forme de sa valeur en fonction de la valeur de la préférence. Si le xml pour la préférence de jeux android:la synthèse d'une chaîne de texte ou une chaîne de ressource de la valeur de la préférence est formaté dans la chaîne (il doit avoir, %d, pour ramasser la valeur). Si android:résumé est fixé à un plaurals ressource, qui est utilisé pour formater le résultat.

// Use your own name space if not using an android resource.
final static private String ANDROID_NS = "http://schemas.android.com/apk/res/android";
private int pluralResource;
private Resources resources;
private String summary;
public SeekBarPreference(Context context, AttributeSet attrs)
{
.
.
.
    TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.SeekBarPreference);
    pluralResource =  attrs.getAttributeResourceValue(ANDROID_NS, "summary", 0);
    if (pluralResource !=  0)
    {
        if (! resources.getResourceTypeName(pluralResource).equals("plurals"))
        {
            pluralResource = 0;
        }
    }
    if (pluralResource ==  0)
    {
        summary = attributes.getString(R.styleable.SeekBarPreference_android_summary);
    }
    attributes.recycle();
}

@Override
public CharSequence getSummary()
{
    int value = getPersistedInt(defaultValue);
    if (pluralResource != 0)
    {
        return resources.getQuantityString(pluralResource, value, value);
    }
    return (summary == null) ? null : String.format(summary, value);
}

  • C'est seulement donné comme un exemple, cependant, si vous voulez, sont tentés de définir le résumé sur l'écran préférences, vous devez alors communiquer notifyChanged() dans la préférence de l' onDialogClosed méthode.

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