L'app per Android che sto sviluppando ha un'attività principale che è cresciuta abbastanza grande. Questo principalmente perché contiene una TabWidgetcon 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 LinearLayoutdichiarato l'elemento root. Ciò si traduce in LinearLayoutun bambino gonfiato di MyCompoundComponentcui già è un LinearLayout!! Quindi ora abbiamo un LinearLayout ridondante in mezzo MyCompoundComponente le viste di cui ha effettivamente bisogno.
Qualcuno può fornirmi un modo migliore per affrontare questo problema, evitando di avere LinearLayoutun'istanza ridondante ?