Una vista personalizada bien diseñada es como cualquier otra clase bien diseñada. Encapsula un un conjunto específico de con una interfaz simple, usa la CPU y la memoria de manera eficiente, etcétera. En además de ser un clase bien diseñada, una vista personalizada debe hacer lo siguiente:
- Cumplen con los estándares de Android.
- Proporciona atributos con estilo personalizados que funcionen con diseños XML de Android.
- Envía eventos de accesibilidad.
- Ser compatible con múltiples plataformas de Android
El framework de Android proporciona un conjunto de clases base y etiquetas XML para ayudarte a crear una vista que cumpla con todos estos y los requisitos de cumplimiento. En esta lección, se analiza cómo usar el framework de Android para crear la base de datos funcionalidad de una vista .
Puedes encontrar información en Componentes de vistas personalizadas.
Crea una subclase para una vista
Todas las clases de vista definidas en el framework de Android extienden
View
Tu
vista personalizada también puede
puedes extender View
directamente
ahorrar tiempo extendiendo una de las
vista existente
subclases, como Button
.
Para permitir que Android Studio interactúe con tu vista, como mínimo debes proporcionar un constructor que tome un
Context
y un objeto AttributeSet
como parámetros.
Este constructor permite que el editor de diseño cree y edite una instancia de tu vista.
Kotlin
class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)
Java
class PieChart extends View { public PieChart(Context context, AttributeSet attrs) { super(context, attrs); } }
Define atributos personalizados
Para agregar un View
integrado a tu interfaz de usuario, especifícalo en un elemento XML y
controlar su
y el comportamiento con atributos de los elementos. También puedes agregar y aplicar estilos
vistas con XML. Para
Para habilitar este comportamiento en tu vista personalizada, haz lo siguiente:
- Define atributos personalizados para tu vista en un elemento del recurso
<declare-styleable>
. - Especifica valores para los atributos en tu diseño XML.
- Recupera valores de atributos en el tiempo de ejecución.
- Aplica los valores de atributo recuperados a tu vista.
En esta sección, se analiza cómo definir atributos personalizados y especificar sus valores. En la siguiente sección, se aborda recuperar y aplicar los valores en el entorno de ejecución.
Para definir atributos personalizados, agrega recursos <declare-styleable>
a tu proyecto. Es habitual colocar estos recursos en un
res/values/attrs.xml
. Aquí tienes
Un ejemplo de un archivo attrs.xml
:
<resources> <declare-styleable name="PieChart"> <attr name="showText" format="boolean" /> <attr name="labelPosition" format="enum"> <enum name="left" value="0"/> <enum name="right" value="1"/> </attr> </declare-styleable> </resources>
Este código declara dos atributos personalizados, showText
y labelPosition
,
que pertenecen a un atributo
la entidad llamada PieChart
. El nombre de la entidad que admite estilo es, por convención, el mismo
como el
nombre de la clase
que define la vista personalizada. Aunque no es necesario seguir esta convención,
muchos códigos populares
los editores dependen de esta convención de nomenclatura para completar las instrucciones.
Una vez que definas atributos personalizados, podrás usarlos en archivos de diseño XML como los integrados
atributos. El único
sus atributos personalizados pertenecen a un espacio de nombres diferente. En lugar de pertenecer
al espacio de nombres http://schemas.android.com/apk/res/android
, pertenecen a http://schemas.android.com/apk/res/[your package name]
. Por ejemplo, aquí te mostramos cómo usar la
definidos para
PieChart
:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto"> <com.example.customviews.charting.PieChart custom:showText="true" custom:labelPosition="left" /> </LinearLayout>
Para evitar tener que repetir el URI de espacio de nombres largo, en el ejemplo se usa un
directiva xmlns
. Esta directiva asigna el alias custom
a
el espacio de nombres http://schemas.android.com/apk/res/com.example.customviews
Puedes elegir cualquier alias que desees para tu espacio de nombres.
Observa el nombre de la etiqueta XML que agrega la vista personalizada al diseño. Es el enfoque
nombre calificado del elemento
una clase de vista personalizada. Si tu clase de vista es interna, califícala
por el nombre de la clase externa de la vista.
Por ejemplo, el
La clase PieChart
tiene una clase interna llamada PieView
. Para usar
atributos personalizados de esta clase,
usa la etiqueta com.example.customviews.charting.PieChart$PieView
.
Aplica atributos personalizados
Cuando se crea una vista a partir de un diseño XML, se leen todos los atributos de la etiqueta XML.
del recurso
y se pasan al constructor de la vista como una
AttributeSet
Si bien es
posible leer valores de AttributeSet
directamente.
tiene algunas desventajas:
- No se resuelven las referencias de recursos dentro de los valores de atributos.
- Los estilos no se aplican.
En su lugar, pasa el AttributeSet
a
obtainStyledAttributes()
Este método devuelve un
TypedArray
array de
valores que son
sin referencias y estilo.
El compilador de recursos de Android hace mucho trabajo para que las llamadas
obtainStyledAttributes()
y fácil de usar. Para cada <declare-styleable>
en el directorio res/
, el R.java
generado define un array de atributos
IDs y un conjunto de
constantes que definen el índice de cada atributo del array. Se usa el modelo de
constantes para leer
los atributos de TypedArray
. Aquí te indicamos cómo hacerlo
la clase PieChart
lee sus atributos:
Kotlin
init { context.theme.obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0).apply { try { mShowText = getBoolean(R.styleable.PieChart_showText, false) textPos = getInteger(R.styleable.PieChart_labelPosition, 0) } finally { recycle() } } }
Java
public PieChart(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0); try { mShowText = a.getBoolean(R.styleable.PieChart_showText, false); textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0); } finally { a.recycle(); } }
Ten en cuenta que los objetos TypedArray
son un recurso compartido
y deben reciclarse después de su uso.
Agrega propiedades y eventos
Los atributos son una forma poderosa de controlar el comportamiento y la apariencia de las vistas, pero
solo se pueden leer
cuando se inicializa la vista. Para brindar un comportamiento dinámico, expone un método get de propiedad y
par de métodos set para cada
atributo personalizado. En el siguiente fragmento, se muestra cómo PieChart
expone una propiedad.
Llamada showText
:
Kotlin
fun isShowText(): Boolean { return mShowText } fun setShowText(showText: Boolean) { mShowText = showText invalidate() requestLayout() }
Java
public boolean isShowText() { return mShowText; } public void setShowText(boolean showText) { mShowText = showText; invalidate(); requestLayout(); }
Observa que setShowText
llama a invalidate()
.
y requestLayout()
. Estas llamadas son cruciales
para garantizar que la vista
se comporte de manera confiable. Necesitas
para invalidar la vista después de cualquier cambio en sus propiedades que pueda modificar su
la apariencia, de modo que
el sistema sabe que debe volver a dibujarse. Del mismo modo, deberás solicitar un diseño nuevo si
una propiedad cambia de manera
que podrían afectar el tamaño o la forma de la vista. Olvidar estas llamadas a los métodos puede causar
difícil de encontrar
entre insectos.
Las vistas personalizadas también deben admitir objetos de escucha de eventos para comunicar eventos importantes. Para
instancia, PieChart
expone un evento personalizado llamado OnCurrentItemChanged
para notificar a los objetos de escucha que
el usuario rotó
un gráfico circular para enfocarse en una nueva porción circular.
Es fácil olvidarse de exponer propiedades y eventos, en especial cuando eres el único usuario. de la vista personalizada. Dedicar tiempo a definir cuidadosamente la interfaz de la vista reduce el mantenimiento futuro. de los costos. Una buena regla a seguir es siempre exponer cualquier propiedad que afecte la visibilidad la apariencia o el comportamiento de tu vista personalizada.
Diseño para la accesibilidad
Tu vista personalizada debe admitir una amplia variedad de usuarios. Esto incluye a los usuarios con discapacidades que y les impiden ver o usar una pantalla táctil. Para ayudar a los usuarios con discapacidades, haz lo siguiente:
- Etiqueta tus campos de entrada con el
android:contentDescription
. . - Llama a
sendAccessibilityEvent()
para enviar eventos de accesibilidad cuando corresponda. - Admite controles alternativos, como un pad direccional o una bola de seguimiento.
Para obtener más información sobre cómo crear vistas accesibles, consulta Cómo mejorar la accesibilidad de las apps