L'application Android que je suis en train de développer a une activité principale qui est devenue assez importante. C'est principalement parce qu'elle contient un TabWidget
avec 3 onglets. Chaque onglet comporte un certain nombre de composants. L'activité doit contrôler tous ces composants à la fois. Donc je pense que vous pouvez imaginer que cette activité a comme 20 champs (un champ pour presque chaque composant). Elle contient également beaucoup de logique (écouteurs de clics, logique pour remplir les listes, etc).
Ce que je fais normalement dans les cadres basés sur les composants est de tout diviser en composants personnalisés. Chaque composant personnalisé a alors une responsabilité claire. Il contient son propre ensemble de composants et toute autre logique liée à ce composant.
J'ai essayé de comprendre comment cela peut être fait, et j'ai trouvé quelque chose dans la documentation d'Android qu'ils aiment appeler un "contrôle composé". (Voir http://developer.Android.com/guide/topics/ui/custom-components.html#compound et faites défiler jusqu'à la section "Compound Controls") Je voudrais créer un tel composant sur la base d'un fichier XML définissant la structure de la vue.
Dans la documentation, il est dit :
Notez que, tout comme pour une activité, vous pouvez utiliser l'approche déclarative (basée sur XML) pour créer les composants contenus, ou vous pouvez les imbriquer ou les imbriquer de manière programmatique dans votre code.
Eh bien, c'est une bonne nouvelle ! L'approche basée sur XML est exactement ce que je veux ! Mais elle ne dit pas comment le faire, si ce n'est que c'est "comme avec une activité"... Mais ce que je fais dans une Activity, c'est appeler setContentView(...)
pour gonfler les vues à partir de XML. Cette méthode n'est pas disponible si vous sous-classez par exemple LinearLayout
.
J'ai donc essayé de gonfler le XML manuellement comme ceci :
public class MyCompoundComponent extends LinearLayout {
public MyCompoundComponent(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.my_layout, this);
}
}
Cela fonctionne, à l'exception du fait que le XML que je charge a LinearLayout
déclaré comme l'élément Root. Il en résulte que l'élément LinearLayout
étant un enfant de MyCompoundComponent
qui lui-même est déjà un LinearLayout
! ! Donc maintenant nous avons un LinearLayout redondant entre MyCompoundComponent
et les vues dont il a réellement besoin.
Quelqu'un peut-il me fournir une meilleure façon d'aborder cette question, en évitant d'avoir une redondance LinearLayout
instancié ?