2012-01-20 14 views
8

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.

Respuesta

17

Creo que el problema es que la fusión ocurre con los elementos secundarios de la etiqueta de combinación, y no con la fusión.

AFAIK, usted está correcto. <merge> es un marcador de posición, no un ViewGroup.

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, eso es una gran cantidad de código innecesario.

Cree un archivo de diseño XML que contenga un elemento MyRelativeLayoutSubclass y coloque allí sus atributos. Luego, infle ese diseño.

+0

Esta es una solución muy obvia, y no tengo ni idea de por qué me la perdí. – gmate

+0

Sin embargo, no le permite tener atributos predeterminados fácilmente. Tengo que volver a ingresarlos cada vez que uso mi componente personalizado. – Timmmm

+0

@Timmmm: 'MyRelativeLayoutSubclass' ciertamente puede tener valores predeterminados para los atributos, utilizados cuando intenta leer los atributos del XML (y no los encuentra). – CommonsWare

1

Extraer todos los atributos en Style fue una solución para mí. Como extra, es dependiendo del tamaño de pantalla a diferencia de los atributos codificados o el código de Java. Tal vez puedas ir más allá y ponerlo en los atributos del Tema.

<com.example.widget.MyCustomView 
    android:id="@+id/my_custom_view" 

    style="@style/MyCustomView.Default"/> 
+0

Los atributos y los LayoutsParams programáticos pueden depender del tamaño de la pantalla. – Xiao

Cuestiones relacionadas