De acuerdo con este ejemplo de CommonsWare logré hacer que mi subclase RelativeLayout se fusionara con mi diseño descrito en un diseño xml con raíz de combinación. Mi única preocupación es que no puedo describir mis parámetros RelativeLayout en xml.Atributos XML del diseño de fusión a RelativeLayout vía inflate
Mi diseño xml:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:my="http://schemas.android.com/apk/res/hu.someproject"
android:layout_width="36dp"
android:layout_height="wrap_content"
android:layout_marginLeft="3dp"
android:layout_marginRight="3dp"
android:width="36dp" >
<RelativeLayout
android:id="@+id/upper_container"
style="?pretty_style"
android:layout_alignLeft="@+id/image_title"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/image_title"
android:layout_centerHorizontal="true" >
<View
android:id="@+id/upper_indicator"
android:layout_width="fill_parent"
android:layout_height="5dp"
android:layout_alignParentTop="true"
android:background="@color/mycolor" />
<TextView
android:id="@+id/text_degree"
style="?pretty_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="23°" />
</RelativeLayout>
<hu.MyView
android:id="@+id/image_title"
style="?my_image_title"
android:layout_below="@+id/upper_container"
android:layout_centerHorizontal="true"
my:myColor="#2f8741"/>
Creo que el problema es que la fusión ocurre a los hijos de la etiqueta de combinación, y no a la fusión en sí. ¿Alguna idea de cómo puedo hacer que mis parámetros en la fusión afecten mi RelativeLayout?
Mi RelativeLayout subclase, sin declaración y las importaciones paquete:
public class MyRelativeLayoutSubclass extends RelativeLayout {
public MyRelativeLayoutSubclass(Context context) {
super(context);
initTile(null);
}
public MyRelativeLayoutSubclass(Context context, AttributeSet attrs) {
super(context, attrs);
initTile(attrs);
}
public MyRelativeLayoutSubclass(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initTile(attrs);
}
private void initTile(Object object) {
final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.my_great_little_layout, this, true);
}
}
Sé que puedo añadir todo a un LayoutParams, y luego añadir mis MyRelativeLayoutSubclass con que LayoutParams, pero me gustaría escapar de eso, que es mucho de código innecesario.
Esta es una solución muy obvia, y no tengo ni idea de por qué me la perdí. – gmate
Sin embargo, no le permite tener atributos predeterminados fácilmente. Tengo que volver a ingresarlos cada vez que uso mi componente personalizado. – Timmmm
@Timmmm: 'MyRelativeLayoutSubclass' ciertamente puede tener valores predeterminados para los atributos, utilizados cuando intenta leer los atributos del XML (y no los encuentra). – CommonsWare