Android - la Rédaction d'un personnalisé (composé) de la composante
L'appli Android, je suis actuellement à l'élaboration d'une activité qui a connu une croissance assez importante. C'est principalement parce qu'il contient un TabWidget
avec 3 onglets. Chaque onglet dispose d'un certain nombre de composants. L'activité de contrôle de tous les composants à la fois. Je pense donc que vous pouvez imaginer que cette Activité a comme 20 champs (un champ pour presque tous les composants). Il contient également beaucoup de logique (cliquez sur les auditeurs, logique pour remplir les listes, etc).
Ce que j'ai l'habitude de le faire en composant en fonction des cadres est de diviser le tout dans des composants personnalisés. Chaque composant personnalisé aurait alors une responsabilité claire. Il contient son propre ensemble de composants et de toutes les autres logiques liées à cette composante.
J'ai essayé de comprendre comment cela peut être fait, et j'ai trouvé quelque chose dans l'Android à la documentation de ce qu'ils aiment appeler un "Composé de Contrôle". (Voir http://developer.android.com/guide/topics/ui/custom-components.html#compound et faites défiler jusqu'à la "Composé de la section" Commandes) je voudrais créer un tel composant basé sur un fichier XML de définition de la vue structure.
Dans la documentation, il est dit:
Noter que tout comme une Activité,
vous pouvez utiliser le déclaratif
(Basé sur XML) approche de la création de la
composants contenus, ou vous pouvez imbriquer
par programmation à partir de votre code.
Bien, que de bonnes nouvelles! L'approche XML est exactement ce que je veux! Mais il ne dit pas comment le faire, sauf qu'elle est "comme une Activité"... Mais ce que je fais dans une Activité d'appel setContentView(...)
pour gonfler les points de vue à partir de XML. Cette méthode n'est pas disponible si vous avez par exemple la sous-classe 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, sauf pour le fait que le XML je suis de chargement a LinearLayout
déclaré que l'élément racine. Cette résultats dans la gonflés LinearLayout
d'être un enfant de MyCompoundComponent
qui lui-même est déjà un LinearLayout
!! Alors maintenant, nous avons une redondant LinearLayout entre MyCompoundComponent
et les vues qu'elle a réellement besoin.
Quelqu'un peut-il merci de me fournir une meilleure façon d'aborder cette question, en évitant d'avoir une redondance LinearLayout
instancié?
- J'aime les questions que j'apprenne quelque chose. Merci.
- J'ai récemment écrit un billet de blog à ce sujet: blog.jteam.nl/2009/10/08/exploring-the-world-of-android-part-3
Vous devez vous connecter pour publier un commentaire.
Utilisation de fusion balise XML racine
Voir cet article.
Je pense que la façon dont vous êtes censé le faire, est d'utiliser votre nom de classe comme le XML de l'élément racine:
Et ensuite votre classe dérivée de n'importe quelle mise en page que vous souhaitez utiliser. Notez que si vous utilisez cette méthode, vous ne pas utiliser la mise en page inflater ici.
Et ensuite vous pouvez utiliser votre point de vue en XML mises en page comme d'habitude. Si vous voulez faire de la vue par programmation, vous devez vous gonflez-le vous-même:
Malheureusement, ce n'est pas vous laisser faire
v = new MyView(context)
car il ne semble pas être un moyen de contourner le imbriquée dispositions de problème, donc ce n'est pas vraiment une solution complète. Vous pouvez ajouter une méthode de ce genre pourMyView
pour le rendre un peu plus agréable:Avertissement: j'ai peut-être parler de compléter les couilles.
<com.example.views.MyView />
et votresetData
etonFinishInflate
les appels commencent à lancer des Npe, et vous n'avez aucune idée de pourquoi.