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

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); } 

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

  • Frontera de elementos de listview en android
  • Android TextView DrawableTint en dispositivos pre v23
  • TextView no se desplaza suavemente
  • ¿Cómo editar el valor de un nodo de un archivo XML existente de una tarjeta SD y guardarlo de nuevo?
  • keyBackground para teclas especiales - teclado android
  • Cortar contenido en TextView
  • Barra de herramientas Appcompat no da estilos a spinner
  • Visualización de la variable en pantalla usando Android por TextViews
  • La forma más fácil de escribir y leer un XML
  • Android XML redondeado esquinas recortadas
  • Cambiar el fondo de LinearLayout en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.