L'app per Android attualmente in sviluppo ha un'attività principale che è diventata abbastanza grande. Questo è principalmente perché contiene uno 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 ogni componente). Inoltre contiene molta logica (click listener, logica per compilare liste, ecc.).Android - Scrittura di un componente (composto) personalizzato
Quello che faccio normalmente in framework basati su componenti è dividere tutto in componenti personalizzati. Ogni componente personalizzato avrebbe quindi una chiara responsabilità. Conterrebbe il proprio insieme di componenti e tutte le altre logiche relative a quel componente.
Ho cercato di capire come farlo e ho trovato nella documentazione di Android qualcosa che a loro piace chiamare un "controllo composto". (Vedere http://developer.android.com/guide/topics/ui/custom-components.html#compound e scorrere fino alla sezione "Controlli composti") Vorrei creare un componente del genere sulla base di un file XML che definisce la struttura della vista.
Nella documentazione si dice:
Nota che, proprio come con un'attività, è possibile utilizzare sia l'approccio dichiarativo (basato su XML) per creare la componenti contenuti, oppure si può nido programmaticamente dal tuo codice.
Bene, questa è una buona notizia! L'approccio basato su XML è esattamente quello che voglio! Ma non dice come farlo, tranne che è "come con un'attività" ... Ma quello che faccio in un'attività è chiamare setContentView(...)
per gonfiare le viste da XML. Questo metodo non è disponibile se si ad esempio sottoclasse LinearLayout
.
Così ho provato a gonfiare manualmente il codice 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);
}
}
Questo funziona, tranne per il fatto che l'XML io sono carico ha LinearLayout
dichiarato come l'elemento radice. Ciò si traduce nel gonfiato LinearLayout
di essere un figlio di MyCompoundComponent
che già è un LinearLayout
!! Quindi ora abbiamo un LinearLayout ridondante tra MyCompoundComponent
e le viste di cui ha effettivamente bisogno.
Qualcuno può fornirmi un modo migliore per avvicinarsi a questo, evitando di avere un LinearLayout
ridondante istanziato?
Amo le domande dalle quali apprendo qualcosa. Grazie. –
Recentemente ho scritto un post su questo argomento: http://blog.jteam.nl/2009/10/08/exploring-the-world-of-android-part-3/ –