Android: vues Multiples des enfants pour l'affichage personnalisé avec mise en page existante
Je dois construire un complexe de vue personnalisée dans Android. Le résultat final devrait ressembler à ceci:
<RelativeLayout>
<SomeView />
<SomeOtherView />
<!-- maybe more layout stuff here later -->
<LinearLayout>
<!-- the children -->
</LinearLayout>
</RelativeLayout>
Cependant, dans les fichiers XML, je veux juste faire définir ce (sans définir SomeView, SomeOtherView etc.):
<MyCustomView>
<!-- the children -->
</MyCustomView>
Est-ce possible dans Android, et si oui: Quelle serait la façon la plus propre de le faire?
Parmi les solutions possibles, qui est venu à mon esprit étaient "remplacer la addView() les méthodes" et "supprimer tous les points de vue et les ajouter à nouveau plus tard", mais je ne suis pas sûr où aller...
Merci beaucoup d'avance pour votre aide! 🙂
Vous devez vous connecter pour publier un commentaire.
Il est tout à fait possible, et l'a encouragé à créer conteneur personnalisé points de vue. C'est ce qu'Android pourrait appeler un composé de contrôle. Donc:
Vous pouvez remplacer autant de versions de
addView()
que vous vous sentez sont nécessaires, mais à la fin ils ont tous l'appellent en arrière à la version que j'ai placé dans l'échantillon. Primordial seulement cette méthode sera le cadre de réussir tous les enfants à l'intérieur de ses balise XML à un enfant en particulier contenant.Et ensuite modifier le XML en tant que tel:
res/layout/custom_layout.xml
La raison de l'utilisation
<merge>
est de simplifier la hiérarchie. Toutes les vues enfant vont s'attacher à votre classe personnalisée, ce qui est unRelativeLayout
. Si vous n'utilisez pas<merge>
, vous vous retrouvez avec unRelativeLayout
attaché à un autreRelativeLayout
attaché à tous les enfants, qui peuvent causer des problèmes.HTH
addView()
comme vous l'avez décrit. J'ai édité l'exemple ci-dessus.Card
l'extension deLinearLayout
qui contient unTextView
que le titre et un autreLinearLayout
contenant les enfants de la carte. Cependant, tout en gonflant la card.xml dans le constructeur,Card.addView()
est appelé, qui tente d'ajouter la carte elle-même à l'un de ses enfants, ce qui entraîne dans unNullPointerException
...MyCustomView
s'étendRelativeLayout
et le conteneur que les enfants sont ajoutés à uneLinearLayout
, marges définies dans le fichier XML pour les enfants ne sont pas respectés. ChangerMyCustomView
d'étendreLinearLayout
cependant, respecte les enfants marges comme prévu. Il y a tout de conversion qui doit être fait entre les deux ViewGroup deLayoutParams
à l'appui de cette?vous pouvez utiliser la balise include