Comment créer une vue personnalisée simple?
-
09-10-2019 - |
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>
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"