Grupo de vista personalizada de Android delegar addView

Quiero implementar ViewGroup personalizado en mi caso derivado de FrameLayout pero quiero que todas las vistas secundarias agregadas desde xml se agreguen no directamente a esta vista sino a FrameLayout contenido en este ViewGroup personalizado. Déjame mostrar un ejemplo para dejarlo en claro.

      

Y quiero redireccionar agregando todas las vistas secundarias a FrameLayout con id frame_layout_child_container .

Así que, por supuesto, addView() métodos de addView() como este

  @Override public void addView(View child) { this.mFrameLayoutChildViewsContainer.addView(child); } 

Pero, por supuesto, esto no funciona porque por el momento mFrameLayoutChildViewsContainer no se agrega a la vista personalizada de la raíz.

Mi idea es siempre mantener un poco de vista en la parte superior de este contenedor frame_layout_top y todas las vistas secundarias agregadas al componente personalizado deben ir a frame_layout_child_container

Ejemplo de uso de vista personalizada

     

Entonces, en este caso, TextView debería agregarse a frame_layout_child_container

¿Es posible delegar agregar todas las vistas en el ViewGroup hijo como describí?

Tengo otras ideas como usar el método bringToFront() cada vez que se agrega la vista para mantenerlas en orden correcto del eje z o, por ejemplo, cuando se agrega vista, FrameLayout en una matriz y luego de inflar la vista personalizada, agrega todas las vistas a este niño FrameLayout

Sugiera qué hacer en este caso para no golpear el rendimiento con la reinflación de todo el diseño cada vez que se agrega una nueva vista, si es posible implementarlo de otra manera.

View infladas desde un diseño, como su ejemplo TextView , no se agregan a su ViewGroup principal con addView(View child) , por lo que anular solo ese método no funcionó para usted. Desea anular los addView(View child, int index, ViewGroup.LayoutParams params) , que todas las demás sobrecargas addView() terminan llamando.

En ese método, verifica si el niño que se agrega es uno de tus dos FrameLayout especiales. Si es así, deja que la super clase maneje el complemento. De lo contrario, agregue el elemento secundario a su contenedor FrameLayout .

 public class CustomFrameLayout extends FrameLayout { private final FrameLayout topLayout; private final FrameLayout containerLayout; ... public CustomFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.custom, this, true); topLayout = (FrameLayout) findViewById(R.id.frame_layout_top); containerLayout = (FrameLayout) findViewById(R.id.frame_layout_child_container); } @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { final int id = child.getId(); if (id == R.id.frame_layout_top || id == R.id.frame_layout_child_container) { super.addView(child, index, params); } else { containerLayout.addView(child, index, params); } } }