2012-08-15 24 views
12

Soy bastante hábil en la creación de diseños personalizados complejos basados ​​en ViewGroup. Lo único que me falta es la capacidad de crear mis LayoutsParams personalizados. Realmente necesito la capacidad de obtener los márgenes y por qué no crear otros params adicionales para pasar a los padres.¿Cómo crear un LayoutParams personalizado para usar en un diseño personalizado?

¿Cómo puedo hacer para crear un LayoutParam personalizado y usarlo a través de xml? Intenté usar un LinearLayout.LayoutParam pero obviamente está fallando porque el padre no es un LinearLayout. ¿Cómo puedo trabajar con LayoutParams en diseños personalizados?

Actualización:

A partir de ahora me quedo con el uso de un FrameLayout y anulando las funciones onMeasure y OnLayout para hacer el diseño mismo. Esto proporciona FrameLayout.LayoutParams. Supongo que los niños tendrían que soportar el LayoutParam personalizado.

+2

Vea este enlace (la última parte de la FlowLayout): http://www.parleys.com/#st=5&id=2191&sl=38. – Luksprog

+0

¡Excelente enlace! ¡Perfecto! – Jona

+0

El enlace de arriba no funciona. Este podría ser útil: https://github.com/ApmeM/android-flowlayout –

Respuesta

19

En su diseño personalizado, cree una clase anidada que se extienda ViewGroup.LayoutParams. Luego, anule algunos métodos (todos los obligatorios están en mi ejemplo). Aquí hay una versión reducida de una de mis diseños personalizados:

public class MyLayout extends ViewGroup { 

    public MyLayout(Context context) { 

    } 

    public MyLayout(Context context, AttributeSet attrs) { 

    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 

    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

    } 

    @Override 
    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 
     return p instanceof LayoutParams; 
    } 

    @Override 
    protected LayoutParams generateDefaultLayoutParams() { 
     return new LayoutParams(); 
    } 

    @Override 
    public LayoutParams generateLayoutParams(AttributeSet attrs) { 
     return new LayoutParams(getContext(), attrs); 
    } 

    @Override 
    protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 
     return generateDefaultLayoutParams(); // TODO Change this? 
    } 

    public static class LayoutParams extends ViewGroup.LayoutParams { 

     public LayoutParams() { 

     } 

     public LayoutParams(int width, int height) { 

     } 

     public LayoutParams(Context context, AttributeSet attrs) { 

     } 

    } 

} 

una explicación más detallada: How to create a FlowLayout (! Gracias por el enlace Luksprog)

+0

¡La publicación @Luksprog estaba en punto muerto! ¡Gracias por publicar un código, ya que otros pueden encontrarlo útil! – Jona

Cuestiones relacionadas