2011-11-13 15 views
19

Tengo mi vista personalizada extendida desde View. Hay 3 vista constructores:¿qué constructor se llamará para ver?

  1. View(Context context, AttributeSet attrs, int defStyle)
  2. View(Context context, AttributeSet attrs)
  3. View(Context context)

Desde mi actividad llamo std.setContentView(R.layout.main). El segundo constructor se llama en mi opinión. ¿Por qué el segundo? ¿Cómo saber de antemano cuál será llamado y por qué?

Respuesta

41

Desde el sitio de desarrolladores de Android bajo la documentación para Vista:

public View (Context context)

constructor simple de usar al crear una vista de código.

Así que este constructor es lo que puede usar para crear una Vista en Java. No se invocará cuando infle desde XML.

public View (Context context, AttributeSet attrs)

Constructor que se llama cuando inflando una vista desde XML. Se invoca cuando una vista se construye a partir de un archivo XML, proporcionando atributos que se especificaron en el archivo XML. Esta versión usa un estilo predeterminado de 0, por lo que los únicos valores de atributo aplicados son aquellos en el Tema del contexto y el Conjunto de atributos dado.

Se llamará al método onFinishInflate() después de que se hayan agregado todos los elementos secundarios.

Por lo tanto, se llamará a este constructor cuando se infle una Vista desde XML cuando no se especifica un estilo.

public View (Context context, AttributeSet attrs, int defStyle)

Realizar la inflación a partir de XML y aplicar un estilo de base específica de clase. Este constructor de Vista permite a las subclases usar su propio estilo base cuando se están inflando. Por ejemplo, un constructor de la clase Button llamaría a esta versión del constructor de la superclase y suministraría R.attr.buttonStyle para defStyle; esto permite que el estilo del botón del tema modifique todos los atributos de la vista base (en particular su fondo), así como los atributos de la clase Button.

Debe implementar todos estos constructores, pero se puede poner todo el trabajo en el tercero llamando this(context, null) y this(context, attrs, 0) para los dos primeros, respectivamente.

+2

super (context, attrs) y super (context, attrs, 0) funciona de manera diferente para mí. El primero es correcto, pero el segundo elimina el estilo original de una vista, por lo que no puedo usar esto (context, attrs, 0). ¿Es un error en las versiones más recientes de Android? – broot

+1

No realice llamadas en cascada al constructor, consulte mi respuesta a continuación. – Jin

+0

Supongo que esta es la respuesta de Jin: http://stackoverflow.com/a/34301725/326874 – aeracode

Cuestiones relacionadas