2012-06-18 3 views
3

Je voudrais créer une vue personnalisée (je vais l'appeler MyComplexView), par exemple un RelativeLayout avec un Imageview, un TextView et un Button.Créer une vue composite dans Android

Je voudrais déclarer un xml avec la mise en page et créer la classe:

MyComplexView extends RelativeLayout{...} 

Mais je ne sais pas ce que je dois passer outre indiquer que la mise en page doit être gonflé.

Comment est-ce que je peux faire ceci? Merci

Répondre

5

Quelque chose comme ceci:

  1. ajouter les constructeurs de la super classe. (Celui avec le contexte est tout simplement pour créer les vues programaticaly, les autres sont quand vous ajoutez la vue en XML.

  2. créer une méthode appelée init() par exemple et l'appeler de chaque constructeur.

  3. intérieur la méthode init faire:

    LayoutInflater.from (contexte) .inflate (R.layout.my_view_layout, cela, vrai);

maintenant gonflent les params supplémentaires signifient:True -> attachez la disposition à la racine dans votre disposition relative case (pro-tip: donc à l'intérieur du xml vous pouvez juste fusionner des tags si votre racine de mise en page est également mise en page et les aligner dans le code afin que la hiérarchie plus simple) ou toute disposition que vous aimez.

cette -> la mise en page pour attacher la vue gonflée à votre disposition relative que vous étendez.

il sera automatiquement attaché à la racine -> étend RelativeLayout.

vous pouvez utiliser findViewById comme:

this.findViewById(R.id.myView); 
+0

Je n'ai jamais compris pourquoi c'est si complexe chez android. Bien sûr, cette possibilité devrait être donnée par Android, mais on pourrait penser que vous pouvez définir des vues personnalisées complexes juste avec XML. – Geki

+0

toutes les vues sont écrites en code, le bouton standard est également écrit en code. vous l'utilisez simplement avec XML et le personnalisez partiellement. Si vous voulez créer une interface utilisateur plus complexe, cela demandera bien sûr des efforts et des connaissances supplémentaires. Ce que j'ai décrit ici est l'une des nombreuses approches pour créer des composants réutilisables. – DArkO

1

Je ne suis pas 100% sûr de ce que votre objectif principal est, donc j'essaie d'être complet:

Si vous souhaitez inclure une mise en page complexe dans d'autres mises en page, vous pouvez simplement définir my_complext_layout.xml, et dans vos autres dispositions mettez:

<include layout="@layout/my_complext_layout" /> 

Si vous devez exécuter votre propre code, vous pourriez alors simplement faire la racine de th La mise en page est MyComplexView et vous pouvez exécuter du code lorsque la vue est créée.

Si vous avez voulu que votre code fonctionne sur la mise en page, implémentez simplement un OnGlobalLayoutListener et ajoutez-le à votre mise en page dans votre constructeur de vues.

1

Mettre en oeuvre un constructeur pour la MyComplexView:

public MyComplexView(Context context, AttributeSet attrs){ 
    LayoutInflater inflater = LayoutInflater.from(context); 
    inflater.inflate(R.layout.header_view, this, true); 
    mHeaderView = (TextView)findViewById(R.id.header); 
    if(mHeaderView != null) 
     mHeaderView.setText("Test"); 

}

1

Voir Custom Components dans le révélateur docs. En particulier la section Compound Controls.

Une fois que vous avez fait votre fichier java, afin de s'y référer en XML, vous devez utiliser un à-dire PackageName qualifié:

<com.yourpackage.YourCustomView 
android:layout_height="wrap_content" 
android:layout_width="wrap_content" /> 
1

Création d'une vue personnalisée est généralement destinée à créer un widget qui n'existe pas encore. Ce que vous essayez de faire, c'est de répéter la même mise en page à plusieurs endroits.

Vous avez plusieurs options pour faire cela en fonction de votre contexte.

  1. Si la mise en page doit être placé dans une peur, il suffit de créer votre mise en page dans un fichier séparé, et l'utiliser dans un ListAdapter. Jetez un oeil à la ListView Tutorial pour cela.

  2. Si cette disposition est une mise en page générique à intégrer dans plusieurs activités, essayez plutôt d'utiliser un fragment. Les fragments sont des sous-parties d'une activité, avec leurs propres vues. Alternativement, vous pouvez simplement intégrer la mise en page dans severall xml en utilisant la balise.

  3. Si vous voulez vraiment une classe personnalisée et un widget unique, vous devez étendre la classe View. L'extension d'une mise en page signifie que vous ne souhaitez pas organiser les widgets enfants différemment (par exemple, organisez-les en cercle). Extension d'une vue, vous pouvez avoir exactement ce que vous voulez (bouton, image, texte) organisé toujours de la même manière. Mais je ne vais pas vous mentir, cela signifiera beaucoup de travail.

Questions connexes