traduccion studio custom create control android android-custom-view

studio - El constructor de vista personalizado no se llama en Android 5.0.2



custom view android kotlin (4)

Aquí está el código fuente de la clase View.java referida. Si lo verifica, verá que siempre se llama esa public View(Context context) . Si crees que no se llama pero ves la vista, entonces el problema está más bien en la parte que detecta si se llama , que en el código de Android. Deberías mirar allí. Podría ser el código de registro o algunos filtros incorrectos en AS, o similar.

Del código fuente también se puede ver que este es el nuevo constructor, que se usa en Android 5.0 y superior, que tiene la mayor implementación.

public View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)

He creado una vista personalizada:

public class SomeView extends View

Los constructores de vista personalizados:

public SomeView (Context context) { super(context); } // Called when view is inflated from xml public SomeView (Context context, AttributeSet attrs) { super(context, attrs); } // Perform inflation from XML and apply a class-specific base style from a theme attribute. public SomeView (Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }

También probé el 4to constructor de api 21 sin suerte:

public VeediView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs,defStyleAttr, defStyleRes); }

En el diseño xml estoy definiendo esta vista y las cosas funcionan bien.

Las pruebas en Galaxy S2 funcionan bien y se llama al constructor de vista, pero cuando se ejecuta la aplicación en Nexus-7 android 5.0.2, no se llama en absoluto a los constructores.

¿Alguna idea de por qué?

¿Podría estar relacionado con dispositivos rooteados?

La vista xml relacionada:

<com.package.name android:id="@+id/scene" android:onClick="startx" style="@style/txt_money_style" android:layout_width="72dp" android:layout_height="72dp" android:background="@drawable/wtbtn" android:layout_gravity="right" android:gravity="center_vertical|right" />


Creo que deberías usar este constructor para bestway:

public SomeView (Context context) { this(context , null); } // Called when view is inflated from xml public SomeView (Context context, AttributeSet attrs) { this(context, attrs , 0); } // Perform inflation from XML and apply a class-specific base style from a theme attribute. public SomeView (Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // Initialize customize constructor here }


En API 21, ahora hay un cuarto constructor que podría ser que su XML lo esté llamando.

De la documentación:

Vista pública (contexto de contexto, atributos AttributeSet, int defStyleAttr, int defStyleRes)

Añadido en el nivel API 21

Realice la inflación desde XML y aplique un estilo base específico de clase de un atributo de tema o recurso de estilo. Este constructor de Vista permite a las subclases usar su propio estilo base cuando se están inflando.

Al determinar el valor final de un atributo particular, hay cuatro entradas que entran en juego:

  1. Cualquier valor de atributo en el AttributeSet dado.
  2. El recurso de estilo especificado en el AttributeSet (llamado "estilo").
  3. El estilo predeterminado especificado por defStyleAttr.
  4. El estilo predeterminado especificado por defStyleRes.
  5. Los valores base en este tema.

Cada una de estas entradas se considera en orden, y la primera lista tiene prioridad sobre las siguientes. En otras palabras, si en el AttributeSet que ha proporcionado, entonces el texto del botón siempre será negro, independientemente de lo que se especifique en cualquiera de los estilos.

Parámetros

contexto El contexto en el que se está ejecutando la vista, a través del cual puede acceder al tema actual, recursos, etc. attrs Los atributos de la etiqueta XML que está inflando la vista. defStyleAttr Un atributo en el tema actual que contiene una referencia a un recurso de estilo que proporciona valores predeterminados para la vista. Puede ser 0 para no buscar valores por defecto. defStyleRes Un identificador de recurso de un recurso de estilo que proporciona valores predeterminados para la vista, se usa solo si defStyleAttr es 0 o no se puede encontrar en el tema. Puede ser 0 para no buscar valores por defecto.


Lo que pasa es que obtuve este código y no lo desarrollé yo mismo y, después de probar todo, resulta que la aplicación tiene varios archivos de diseño:

diseño grande, diseño pequeño etc ...

Solo definí la vista personalizada en la carpeta de diseño, por lo que al cambiar a otros tamaños de pantalla se invoca la vista normal.

Supongo que otros pueden aprender de mi error, deseo que Android Studio o Eclipse puedan soportar algún tipo de setContentView (R.layout.activity_scene) y la opción de depuración del archivo relacionado

Entonces, la respuesta es asegurarse de que todos los diseños tengan la vista personalizada definida