Podemos hacer que nuestros parámetros de función tengan un tipo personalizado de enum (así podremos ver una descripción de lo que pasamos y a la función le llega un entero que sera más sencillo de tratar que un String y el texto descriptivo del enum será mas sencillo de modificar.
Para este ejemplo tendremos dos ficheros:
https://github.com/pinguytaz/extAppInventor/blob/main/Ejemplos/src/losejemplos/helpers/TipoEnum.java
https://github.com/pinguytaz/extAppInventor/tree/main/Ejemplos/src/losejemplos/Enumerado.java
Para tener un menú desplegable de un enumerado lo realizaremos creando una clase TipoEnum que tendrá la definición, este fichero se generara en un directorio inferior llamado «helpers» que es donde tendremos todas nuestras clases auxiliares. Por este motivo nuestro ejemplo comenzara indicando que es un paquete de helpers
package losejemplos.helpers;
Esta enumeración especial sera una implementación de la interfaz «OptionList<T>«, en nuestro caso el tipo «T» sera Integer ya que retorna valores enteros»OptionList<Integer>» y ademas de la definición de los valores tendremos los metodos:
- toUnderlyingValue() Que retorna el valor de tipo «T».
- fromUnderlyingValue(T) que recoge el valor de tipo «T» y lo convierte a una instancia de la enumeración.
Quedando un código de la siguiente forma:
public enum TiposEnum implements OptionList<Integer> {
UnValor(0),
ElUno(1),
UnDo(2),
Varios(3);
private int tipoEnum;
TiposEnum(int tipoEnum) {
this.tipoEnum = tipoEnum;
}
public Integer toUnderlyingValue() {
return tipoEnum;
}
private static final Map<Integer, TiposEnum> lookup = new HashMap<>();
static {
for(TiposLog tipoEnum : TiposEnum.values()) {
lookup.put(tipoEnum.toUnderlyingValue(), tipoEnum);
}
}
public static TiposEnum fromUnderlyingValue(int tipoEnum) {
return lookup.get(tipoEnum);
}
}
Ahora definiremos la función de nuestra extensión que llamaremos «LaFuncion» y que recibirá un tipo enum llamado «TipoEnum«, los nombres que se mostraran serán los definidos en nuestra enumeración.
El valor por defecto es el primer valor que definamos pero podríamos especificar otros si usamos la anotación @Default como podemos ver.
UnValor(0),
ElUno(1),
@Default En este caso el valor por defecto sera "UnDos"
UnDo(2),
Varios(3);
Si generamos una nueva versión y eliminamos un valor y queremos indicar que ya no se puede usar tendríamos que usar la anotación @Deprecated.
public String LaFuncion(@Options(TipoEnum.class) final int tipo) { ...... }
Los desplegables que se especifican con la anotación @Options que es la que hemos utilizado se puede aplicar en el parámetros de la función y en el retorno, ademas se podrá utilizar en los parámetros de los eventos (que veremos más adelante) y en las propiedades, tanto al asignar como a recuperar valor.
Tenemos otra anotación que nos permite realizar un filtro por ejemplo de ficheros que utiliza la anotación @Asset que nos permite de forma activa realizar filtros de ficheros, en este caso solo se los parámetros de funciones y la asignación de propiedades son las que la pueden utilizar.