Es absolutamente posible, y recomendado, crear vistas personalizadas de contenedor. Esto es lo que Android llamaría un control compuesto. Por lo tanto:
public class MyCustomView extends RelativeLayout {
private LinearLayout mContentView;
public MyCustomView(Context context) {
this(context, null);
}
public MyCustomView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
//Inflate and attach your child XML
LayoutInflater.from(context).inflate(R.layout.custom_layout, this);
//Get a reference to the layout where you want children to be placed
mContentView = (LinearLayout) findViewById(R.id.content);
//Do any more custom init you would like to access children and do setup
}
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
if(mContentView == null){
super.addView(child, index, params);
} else {
//Forward these calls to the content view
mContentView.addView(child, index, params);
}
}
}
Puede anular tantas versiones de addView()
como se sienta son necesarios, pero al final todos ellos llamada de vuelta a la versión que se coloca en la muestra. Al anular solo este método, el marco pasará todos los elementos secundarios encontrados dentro de su etiqueta XML a un contenedor secundario específico.
Y luego modificar el XML como por ejemplo:
res/layout/custom_layout.xml
<merge>
<SomeView />
<SomeOtherView />
<!-- maybe more layout stuff here later -->
<LinearLayout
android:id="@+id/content" />
</merge>
La razón para usar <merge>
es simplificar la jerarquía. Todas las vistas secundarias se adjuntarán a su clase personalizada, que es RelativeLayout
. Si no usa <merge>
, termina con un RelativeLayout
adjunto a otro RelativeLayout
adjunto a todos los elementos secundarios, que puede causar problemas.
HTH
la solución, porque dije: quiero definir a los niños en otros lugares (no en la vista personalizada). Más exactamente: tengo archivos de diseño a.xml, b.xml, c.xml, todos con la misma vista personalizada, pero con diferentes elementos secundarios en LinearLayout. – mreichelt
Eso también es perfectamente aceptable, y yo diría que el método más fácil sería anular 'addView()' como describió. Edité el ejemplo de arriba. – Devunwired
¡Gracias! Es bueno ver que estos problemas se resuelven incluso después de tanto tiempo. :) – mreichelt