Lun. Sep 26th, 2022

Últimamente, como saben quienes siguen este blog, estoy desarrollando una aplicación para dispositivos móviles basada en Xamarin. 

Luego de haberla publicado en el Store de Google, algunos usuarios me señalan que en dispositivos Samsung no es posible indicar los valores que contiene cifras decimales, debido a que no funciona el botón en el teclado numérico que se les presenta.

Al inicio la cosa me pareció no creíble, ya que a nivel de código se utiliza sencillamente una indicación del tipo de teclado que queremos que el dispositivo utilice para el Entry que está recibiendo los datos.

En mi caso el Entry es el indicado en la siguiente captura de pantalla.

El Problema del Teclado Numérico Samsung

el Entry especificado en tiempo de ejecución, debería verse de la siguiente manera:

Captura desde un teléfono físico real Huawei

Es decir los caracteres admitidos son solo los números y los símbolos de separación de decimales como la coma o el punto, ya que según la región uno de esos dos elementos se utiliza para indicar una cifra con valores decimales no enteros.

Obviamente esto ahorra mucho tiempo al momento de tener que validar y realizar operaciones de cálculo con los datos ingresados. 

En otras palabras a pesar que los elementos Entry, permiten el ingreso de texto, se puede restringir el campo a que ese texto que se ingresa corresponda solo a números.

Por ese motivo en la propiedad Keyboard del Entry he asignado el valor “Numeric”.

En dispositivos Samsung, el problema es que no permite que el usuario utilice el punto (o la coma) en el teclado numérico que aparece.

Al menos eso es lo que señalan los usuarios que iniciaron a utilizar NINO APP.

Problema Constatado

A pesar de ser muy populares y utilizados, no soy un fanático de los teléfonos  Samsung,  de hecho los pocos teléfonos que he tenido en mi vida han sido Ericsson, Sony-Ericsson y el que actualmente poseo y utilizo es un Huawei.

En vista de lo inusual e increíble de lo señalado por los usuarios, he pedido prestado un Samsung S7 Edge  para descargar NINO APP y verificar en primera persona el particular.

Efectivamente el problema es que a pesar que el botón (o tecla si se prefiere) aparece visualmente, no es posible utilizarlo ya que no responde si se lo prueba a utilizar.

Es decir si bien es cierto el teclado numérico aparece correctamente, no es posible ingresar cantidades no enteras.

En el emulador de Visual Studio esta anomalía nunca se presentó

A continuación una captura de pantalla de la misma sección que un dispositivo no Samsung funciona correctamente.

Teclado Numérico Samsung
Captura de la sección en un Samsung Galaxy S7 Edge

Solución

Luego de analizar varias posibles soluciones que encontré en Internet, opté por la más simple desde mi punto de vista.

Descarté aquellas en las que tendría que basarme en el DeviceInfo.Manufacturer  ya que eso implicaría que si en algún otro modelo de teléfono surge otro inconveniente podría tener que escribir código específico para ese modelo/marca.

La idea central de mi solución (que no es mía propiamente) es la de utilizar otro tipo de teclado que contenga básicamente los números y de descartar aquellos caracteres que no me sirven para el proceso.

Cambio entonces el tipo de teclado de “Numeric” a “Telephone”, porque es un tipo de teclado que proporciona los números y los signos de punto y coma.

He tenido que renunciar a la funcionalidad del evento TextChanged en el que realizaba el calculo del precio unitario * la cantidad, y realizar el cálculo solo cuando el usuario ha ingresado totalmente la cifra con el evento Unfocused.

En las siguientes lineas, explico los pasos de la solución que al final he implementado.

Crear una Clase Behavior

Lo primero que se debe realizar es crear una clase Behavior que al momento que el usuario presione cualquier tecla, valide si el valor ingresado es admitido para el cálculo.

La utilidad de esta clase, que luego enlazaremos al control Entry en XAML, es que la podremos utilizar en cualquier Entry que necesitemos en futuro dentro de la APP.

En mi caso particular he denominado esta clase  IngresosNumericos.

En ella elimino todos los elementos presentes en el teclado (“Telephone”) que utilizaré en el Entry.

Estos caracteres no admitidos estan presentes en la variable SpecialCharacters

A continuación el código de la clase, misma que se encuentra dentro de una carpeta llamada Clases en mi solución

Enlazar el Behavior al archivo XAML

Ahora en el archivo XAML que controla el ingreso de los datos, coloco al inicio una referencia a la carpeta de clases.

xmlns:behaviors="clr-namespace:NinoApp.Clases"

Y luego el Entry viene también enlazado a la clase que creamos por medio de Entry.Behaviors.

Además he cambiado la propiedad Keyboard de “Numeric” a “Telephone”, ya que como mencionamos con el “Numeric” en los teléfonos Samsung el botón no funciona.

El teclado en modalidad “Telephone” en cambio no presenta el problema motivo de este articulo.

Teclado "Telephone" de un Huawei
Teclado Numérico Samsung
Teclado tipo Telephone del Samsung Galaxy S7 Edge funcionando

Espero que esta pequeña solución te sea útil si, como yo, te has encontrado con Xamarin y el problema del Teclado Numérico Samsung

By Enrique Vásquez B.

Programador desde 1988, con pasión por escribir artículos de todo tipo. Actualmente desarrolla para ZEVEN S.A. el Sistema de Facturación Electrónica. Ecuatoriano de nacimiento e italiano de residencia, escribe desde Génova, ciudad que ha llegado a amar tanto como su natal Guayaquil. Padre de dos hijos que son su orgullo y esposo de una mujer excepcional.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.