Question

Je voudrais créer un View personnalisé sur Android. Je l'ai essayé de le faire aussi simple que possible et a créé un MyView de classe presque vide et utilisé dans mon LinearLayout mais l'application échoue au démarrage avec « Force Close ». Comment puis-je faire un View personnalisé simple? Selon bâtiment composants personnalisés la View obtient la taille 100x100 si Je ne l'emportait pas sur onMeasure().

public class MyView extends View {

    public MyView(Context context) {
        super(context);
    }
}

Et je l'utilise dans un LinearLayout avec:

<view
    class="com.example.MyView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0" />

Qu'est-ce que je fais mal?


Si j'utilise le constructeur que itemon proposer et l'appel correspondant à la superclasse. Puis est parti, mais mon LinearLayout est cassé, les composants après MyView n'est pas montré la « Force Close ».

Voici mon main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0"
    android:background="#f00"
    android:text="Hello"
/>
<view
    class="com.example.MyView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0"
/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.0"
    android:background="#00f"
    android:text="World"
/>
</LinearLayout>
Était-ce utile?

La solution

peut être vous pouvez définir une autre méthode constructeur comme ceci:

public MyView(Context context, AttributeSet attrs)

le cadre Android va essayer de construire l'interface utilisateur avec votre point de vue du constructeur ci-dessus.

Autres conseils

Le Guide du développeur Android a une section intitulée Éléments de construction sur mesure. Malheureusement, les attributs de la discussion XML ne couvre que la commande à l'intérieur déclarant le fichier de mise en page et la manipulation pas réellement les valeurs à l'intérieur de l'initialisation de la classe. Les étapes sont les suivantes:

déclarer les attributs à des valeurs \ attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyCustomView">
        <attr name="android:text"/>
        <attr name="android:textColor"/>            
        <attr name="extraInformation" format="string" />
    </declare-styleable>
</resources>

Notez l'utilisation d'un nom non qualifié dans la balise-styleable déclare. Android attributs non standard comme besoin extraInformation d'avoir leur type déclaré. Mots clés déclarés dans la superclasse seront disponibles dans les sous-classes sans avoir à être redéclarée.

Créer des constructeurs

Comme il y a deux constructeurs qui utilisent un AttributeSet pour l'initialisation, il est commode de créer une méthode d'initialisation séparée pour les constructeurs appeler.

private void init(AttributeSet attrs){  
    TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.MyCustomView);
    //Use a
    Log.i("test",a.getString(R.styleable.MyCustomView_android_text));
    Log.i("test",""+a.getColor(R.styleable.MyCustomView_android_textColor, Color.BLACK));
    Log.i("test",a.getString(R.styleable.MyCustomView_android_extraInformation));
    //Don't forget this
    a.recycle();
}

R.styleable.MyCustomView est une ressource int [] autogenerated où chaque élément correspond à l'ID d'un attribut. Les attributs sont générés pour chaque propriété dans le fichier XML en ajoutant le nom d'attribut au nom de l'élément. Les attributs peuvent être récupérés à partir du TypedArray en utilisant diverses fonctions get. Si l'attribut n'est pas défini dans le fichier XML, alors NULL est renvoyée. Sauf, bien sûr, si le type de retour est une primitive, dans ce cas, le second argument est retourné.

Si vous ne voulez pas récupérer tous les attributs, il est possible de créer ce tableau manuellement.Dispositif ID pour les attributs android standards sont inclus dans android.R.attr, alors que les attributs de ce projet sont en R.attr .

int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};

S'il vous plaît noter que vous ne devriez pas utiliser quoi que ce soit dans android.R.styleable, selon ce fil, il peut changer à l'avenir. Il est encore dans la documentation comme pour afficher toutes ces constantes en un seul endroit est utile.

Utilisez dans une mise en page des fichiers tels que la mise en page \ main.xml Inclure la déclaration d'espace de noms

  

xmlns: app = "http://schemas.android.com/apk/res/com.mycompany.projectname"

dans l'élément XML de niveau supérieur.

<com.mycompany.projectname.MyCustomView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:text="Test text"
    android:textColor="#FFFFFF"
app:extraInformation="My extra information";
/> 

Référence la vue personnalisée en utilisant le nom complet.

  

applications LabelView Sample

Si vous voulez un exemple complet, regardez l'exemple de vue de l'étiquette Android.

LabelView.java

TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
CharSequences=a.getString(R.styleable.LabelView_text);
attrs.xml

<declare-styleable name="LabelView">
    <attr name="text"format="string"/>
    <attr name="textColor"format="color"/>
    <attr name="textSize"format="dimension"/>
</declare-styleable>

custom_view_1.xml

<com.example.android.apis.view.LabelView
    android:background="@drawable/blue"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    app:text="Blue"app:textSize="20dp"/>

Ceci est contenu dans un LinearLayout avec un attribut d'espace de nom:

  

xmlns: app = "http://schemas.android.com/apk/res/com.example.android.apis"

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