Android personalizado Ver Constructor
-
04-10-2019 - |
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);
}
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);
}