Pregunta

estoy aprendiendo sobre el uso de vistas personalizadas de los siguientes:

http://developer.android.com/guide/ temas / ui / medida components.html # modificador

La descripción dice:

Clase de inicialización Como siempre, la Super es llamado primero. Además, esto no es un constructor por defecto, pero un parametrizar uno. El EditarTexto es creado con estos parámetros cuando se se infla a partir de un archivo de diseño de XML, por lo tanto, nuestro constructor necesita tanto tomarlos y pasarlos a la superclase constructor también.

¿Hay una mejor descripción? He estado tratando de averiguar lo que el constructor (s) debe ser similar y yo he llegado con 4 opciones posibles (véase el ejemplo al final del post). No estoy seguro de lo que hacen estas 4 opciones (o no hacen), por la que debe ponerlas en práctica, o lo que significan los parámetros. ¿Hay una descripción de estos?

public MyCustomView()
{
    super();
}

public MyCustomView(Context context)
{
    super(context);
}

public MyCustomView(Context context, AttributeSet attrs)
{
    super(context, attrs);
} 

public MyCustomView(Context context, AttributeSet attrs, Map params)
{
    super(context, attrs, params);
} 
¿Fue útil?

Solución

no es necesario la primera, como que simplemente no funcionará.

El tercero se quiere decir que su View personalizado estará utilizable a partir de archivos de diseño XML. Si no se preocupan por eso, no lo necesita.

El cuarto es simplemente incorrecto, que yo sepa. No hay ningún constructor View que tomar una Map como tercer parámetro. Hay una que toma un int como tercer parámetro, que se utiliza para anular el estilo por defecto para el widget.

Yo tiendo a usar la sintaxis this() combinar los siguientes:

public ColorMixer(Context context) {
    this(context, null);
}

public ColorMixer(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public ColorMixer(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // real work here
}

Se puede ver el resto de este código en este ejemplo reservar .

Otros consejos

Aquí hay un patrón de mi (la creación de un ViewGoup costumbre aquí, pero aún así):

// CustomView.java

public class CustomView extends LinearLayout {

    public CustomView(Context context) {
        super(context);
        init(context);
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public CustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    private void init(Context ctx) {
        LayoutInflater.from(ctx).inflate(R.layout.view_custom, this, true);
            // extra init
    }

}

y

// view_custom.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Views -->
</merge>

Cuando se agregan a su View personalizado desde xml como:

 <com.mypack.MyView
      ...
      />

se necesita el constructor público MyView(Context context, AttributeSet attrs), de lo contrario obtendrá una Exception cuando se trata Android a inflate su View.

Y cuando se agrega su View de xml y especifique el android:style attribute como:

 <com.mypack.MyView
      style="@styles/MyCustomStyle"
      ...
      />

también tendrá la tercera constructor público MyView(Context context, AttributeSet attrs,int defStyle).

El tercer constructor se utiliza por lo general al ampliar un estilo y personalizarlo, y luego que le gustaría establecer que style a un View dada en sus diseños

Editar detalles

public MyView(Context context, AttributeSet attrs) {
            //Called by Android if <com.mypack.MyView/> is in layout xml file without style attribute.
            //So we need to call MyView(Context context, AttributeSet attrs, int defStyle) 
            // with R.attr.customViewStyle. Thus R.attr.customViewStyle is default style for MyView.
            this(context, attrs, R.attr.customViewStyle);
    }

ver este

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top