android - name - shortcode mailchimp
Relleno perdido usando la etiqueta<merge> con Componente Compuesto Personalizado (2)
Aquí hay un componente compuesto personalizado que extiende RelativeLayout
e infla un diseño particular de xml:
public class MyCustomView extends RelativeLayout {
public MyCustomView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.my_custom_view, this);
// ...
}
}
El diseño xml usa la etiqueta <merge>
(elimina la capa innecesaria de la jerarquía de vistas, yada yada yada):
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content" ... />
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" ... />
...
</merge>
... y uso la vista personalizada en otros diseños como este:
<com.example.MyCustomView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="20dip" />
Todo dentro de la vista personalizada está impecablemente distribuido, pero no se aplica el relleno de 20dips que se supone que rodea a todo el objeto. No parece funcionar si lo puse en la etiqueta <merge>
tampoco. La falta de relleno hace que se vea completamente horrible, por supuesto. ¿Dónde se supone que debo colocar el atributo android:padding="20dip"
para aplicarlo?
Lo más fácil podría ser hacer que MyCustomView
extienda FrameLayout
y reemplace la etiqueta <merge>
con un <RelativeLayout>
- pero eso sacrifica todo el asunto de mantener la jerarquía de vistas poco profunda que Romain Guy se toma tan en serio :)
Ahora utilizo una solución para establecer los rellenos mediante programación. Y buscando probablemente una mejor solución.
// Inflate the view from the layout resource.
LayoutInflater li = LayoutInflater.from( context );
View root = li.inflate( R.layout.article_head, this, true );
int padding = convertDip2Pixels( context, 8 );
root.setPadding( padding, padding, padding, padding );
public static int convertDip2Pixels( Context context, int dip ) {
return (int)TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP,
dip, context.getResources().getDisplayMetrics() );
He tenido problemas similares con el relleno no la transferencia. ¿Has intentado usar Margin en su lugar?