La aplicación de Android que estoy desarrollando actualmente tiene una actividad principal que ha crecido bastante. Esto se debe principalmente a que contiene un TabWidget
con 3 pestañas. Cada pestaña tiene bastantes componentes. La actividad tiene que controlar todos esos componentes a la vez. Así que creo que puedes imaginar que esta actividad tiene como 20 campos (un campo para casi todos los componentes). También contiene mucha lógica (haga clic en oyentes, lógica para llenar listas, etc.).Android - Escribir un componente personalizado (compuesto)
Lo que normalmente hago en marcos basados en componentes es dividir todo en componentes personalizados. Cada componente personalizado tendría una responsabilidad clara. Contendría su propio conjunto de componentes y toda otra lógica relacionada con ese componente.
Traté de descubrir cómo se puede hacer esto, y encontré algo en la documentación de Android lo que les gusta llamar un "control compuesto". (Consulte http://developer.android.com/guide/topics/ui/custom-components.html#compound y vaya a la sección "Controles compuestos") Me gustaría crear dicho componente en base a un archivo XML que defina la estructura de vista.
En la documentación que dice:
Tenga en cuenta que al igual que con una actividad, puede utilizar ya sea el enfoque declarativo (basado en XML) para crear el componentes contenidos, o puede anidar ellos programáticamente desde tu código.
Bueno, eso es una buena noticia! ¡El enfoque basado en XML es exactamente lo que quiero! Pero no dice cómo hacerlo, excepto que es "como con una actividad" ... Pero lo que hago en una actividad es llamar al setContentView(...)
para inflar las vistas desde XML. Ese método no está disponible si, por ejemplo, la subclase LinearLayout
.
así que traté de inflar el XML manualmente así:
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);
}
}
Esto funciona, excepto por el hecho de que el XML estoy de carga tiene LinearLayout
declarada como elemento raíz. Esto da como resultado que el LinearLayout
inflado es un hijo de MyCompoundComponent
que ya es un LinearLayout
!! Entonces ahora tenemos LinearLayout redundante entre MyCompoundComponent
y las vistas que realmente necesita.
¿Alguien me puede dar una mejor manera de abordar esto, evitando tener una instancia LinearLayout
redundante?
Me encantan las preguntas de las que aprendo algo. Gracias. –
Hace poco escribió una entrada de blog acerca de esto: http://blog.jteam.nl/2009/10/08/exploring-the-world-of-android-part-3/ –