L'app per Android che sto sviluppando ha un'attività principale che è cresciuta abbastanza grande. Questo principalmente perché contiene una TabWidget
con 3 schede. Ogni scheda ha alcuni componenti. L'attività deve controllare tutti quei componenti contemporaneamente. Quindi penso che tu possa immaginare che questa attività abbia come 20 campi (un campo per quasi tutti i componenti). Inoltre contiene molta logica (fare clic su listener, logica per compilare elenchi, ecc.).
Quello che faccio normalmente nei framework basati su componenti è quello di suddividere tutto in componenti personalizzati. Ogni componente personalizzato avrebbe quindi una chiara responsabilità. Conterrebbe il proprio set di componenti e tutte le altre logiche correlate a quel componente.
Ho provato a capire come si può fare, e ho trovato qualcosa nella documentazione di Android quello che a loro piace chiamare un "controllo composto". (Vedi http://developer.android.com/guide/topics/ui/custom-components.html#compound e scorri fino alla sezione "Comandi composti") Vorrei creare un componente del genere basato su un file XML che definisce il visualizza la struttura.
Nella documentazione si dice:
Si noti che proprio come con un'attività, è possibile utilizzare l'approccio dichiarativo (basato su XML) per creare i componenti contenuti oppure è possibile nidificarli a livello di codice dal proprio codice.
Bene, questa è una buona notizia! L'approccio basato su XML è esattamente quello che voglio! Ma non dice come farlo, tranne per il fatto che è "come con un'attività" ... Ma quello che faccio in un'attività è chiamare setContentView(...)
per gonfiare le viste da XML. Tale metodo non è disponibile se, ad esempio, la sottoclasse LinearLayout
.
Quindi ho provato a gonfiare manualmente l'XML in questo modo:
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);
}
}
Funziona, tranne per il fatto che l'XML che sto caricando ha LinearLayout
dichiarato l'elemento root. Ciò si traduce in LinearLayout
un bambino gonfiato di MyCompoundComponent
cui già è un LinearLayout
!! Quindi ora abbiamo un LinearLayout ridondante in mezzo MyCompoundComponent
e le viste di cui ha effettivamente bisogno.
Qualcuno può fornirmi un modo migliore per affrontare questo problema, evitando di avere LinearLayout
un'istanza ridondante ?