Constructor de vista personalizada de Android
Estoy aprendiendo sobre el uso de vistas personalizadas de lo siguiente:
Http://developer.android.com/guide/topics/ui/custom-components.html#modifying
- Botón de anillo redondo en Android
- El fragmento no se puede convertir en Contexto
- ¿Cómo puedo reducir el relleno interno alrededor del texto dentro de un objeto de botón de Android?
- Error de paquete de aplicación firmada de exportación de Android
- Flechas personalizadas sin imagen: Android
La descripción dice:
Inicialización de la clase Como siempre, el súper se llama primero. Además, este no es un constructor predeterminado, sino uno parametrizado. El EditText se crea con estos parámetros cuando se infla de un archivo de diseño XML, por lo tanto, nuestro constructor necesita tanto tomarlos y pasarlos al constructor de la superclase también.
¿Hay una mejor descripción? He estado tratando de averiguar lo que debe ser el constructor (s) y he venido con 4 opciones posibles (ver el ejemplo al final de la publicación). No estoy seguro de lo que hacen estas 4 opciones (o no lo hacen), por qué debería implementarlas, o lo que significan los parámetros. ¿Hay una descripción de éstos?
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); }
- Leer de forma programada Estado de depuración en Manifest
- Centre ImageView dentro de otro ImageView en Android
- ¿Cómo pasar una ruta de acceso de archivo que está en la carpeta assets a File (String path)?
- Android xml parámetros dibujables
- Quiero usar Xpath en Android para analizar XML
- Obtener elementos por nombre de etiqueta de un nodo en documento de Android (XML)?
- Android: lee un archivo XML con HTTP GET
- Adición de espacios en blanco al diseño
Usted no necesita el primero, ya que simplemente no funcionará.
El tercero significará que su View
personalizada será utilizable desde archivos de diseño XML. Si no te importa eso, no lo necesitas.
El cuarto es simplemente incorrecto, AFAIK. No hay un constructor View
que tome un Map
como el tercer parámetro. Hay uno que toma un int
como el tercer parámetro, utilizado para anular el estilo predeterminado para el widget.
Tiendo a usar la sintaxis this()
para combinar estos:
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 }
Puede ver el resto de este código en este ejemplo de libro .
Aquí hay un patrón de mi (crear un ViewGoup
personalizado 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 usted está agregando su View
personalizada de xml
como:
<com.mypack.MyView ... />
Necesitará el constructor público MyView(Context context, AttributeSet attrs),
contrario obtendrá una Exception
cuando Android
intente inflate
su View
.
Y cuando agregas tu View
from xml
y también especificas el attribute
android:style
como:
<com.mypack.MyView style="@styles/MyCustomStyle" ... />
También necesitará el tercer constructor público MyView(Context context, AttributeSet attrs,int defStyle)
.
El tercer constructor suele utilizarse cuando se extiende un estilo y se personaliza, y luego se desea establecer ese style
en una View
determinada 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); }
Mira esto