web-dev-qa-db-fra.com

Comment utiliser InputType = numberDecimal avec le clavier virtuel "téléphone"?

Pour une boîte EditText, l'utilisateur ne doit entrer que des nombres valides. J'utilise donc Android:inputType="numberDecimal". Malheureusement, le clavier virtuel qu'Android affiche ne comporte que des chiffres le long de la rangée supérieure, tandis que les trois rangées suivantes comportent divers autres symboles (signe dollar, signe de pourcentage, point d'exclamation, espace, etc.). Étant donné que la numberDecimal accepte uniquement les chiffres 0 à 9, le signe négatif et le point décimal, il serait plus logique d'utiliser le clavier logiciel "téléphone" (0 à 9 dans une grille 3x3, ainsi que quelques autres symboles). Cela rendrait les boutons plus gros et plus faciles à utiliser (puisqu'il s'agit d'une grille 4x4 plutôt que d'une grille 10x4 dans la même zone d'écran). Malheureusement, utiliser Android:inputType="phone" autorise des caractères non numériques tels que des parenthèses.

J'ai tenté d'utiliser Android:inputType="numberDecimal|phone", mais l'aspect numberDecimal de l'indicateur de bit semble être ignoré. J'ai également essayé d'utiliser Android:inputType="phone" en combinaison avec Android:digits="0123456789-.", mais cela permet tout de même plusieurs signes négatifs ou points décimaux (inputType="number" contrôle vraiment bien les erreurs de ce genre, et ne permet même pas à l'utilisateur de le saisir). J'ai également essayé d'utiliser Android:inputType="phone" dans le fichier de présentation XML, tout en utilisant un DigitsKeyListener dans le code Java, mais cela n'utilise que le clavier virtuel numéro par défaut (celui qui ne comporte que des chiffres le long de la ligne du haut) (il semble définir InputType.TYPE_CLASS_NUMBER, qui annule le InputType.TYPE_CLASS_PHONE défini par la mise en page xml).

L'écriture d'un IME personnalisé ne fonctionnerait pas, car l'utilisateur devrait sélectionner l'IME en tant qu'option globale en dehors de l'application.

Existe-t-il un moyen d'utiliser le clavier logiciel de type "téléphone" tout en utilisant également les restrictions "de nombre" pour ce qui est entré?

19
Adam Dunn

Jusqu'ici, j'ai décidé d'étendre DigitsKeyListener et de remplacer getInputType () afin qu'il retourne InputType.TYPE_CLASS_PHONE. Cela me permet d’utiliser la méthode pratique filter () dans DigitsKeyListener, tout en utilisant le clavier logiciel TYPE_CLASS_PHONE. Je suis nouveau dans la programmation Android, mais cela semble fonctionner sans rien casser. Le code ressemble à ceci:

import Android.text.method.DigitsKeyListener;
import Android.text.InputType;
public class CustomDigitsKeyListener extends DigitsKeyListener
{
    public CustomDigitsKeyListener() {
        super(false, false);
    }

    public CustomDigitsKeyListener(boolean sign, boolean decimal) {
        super(sign, decimal);
    }

    public int getInputType() {
        return InputType.TYPE_CLASS_PHONE;
    }
}

Y at-il quelque chose qui cloche en faisant cela (basculer le retour de getInputType () vers quelque chose que la superclasse n'avait pas l'intention de faire)?

7
Adam Dunn

J'ai eu le même problème. Cela fonctionne pour moi:

<item name="Android:inputType">numberDecimal</item>
<item name="Android:digits">0123456789.</item>

Espérons que cela vous aide.

20
tjkn24

Vous utilisez simplement le clavier du téléphone et vérifiez l’entrée par vous-même. Ce n’est pas une très grande condition de vérifier si l’entrée est un chiffre valide compris entre 0 et 9.

1
anon

Le code d'Adam Dunn fonctionne parfaitement, mais n'a pas montré comment implémenter la classe

import Android.text.method.DigitsKeyListener;
import Android.text.InputType;
public class CustomDigitsKeyListener extends DigitsKeyListener
{
    public CustomDigitsKeyListener() {
        super(false, false);
    }

    public CustomDigitsKeyListener(boolean sign, boolean decimal) {
        super(sign, decimal);
    }

    public int getInputType() {
        return InputType.TYPE_CLASS_PHONE;
    }
}

alors vous devez par exemple comme ça

MyTextView.setKeyListener(new CustomDigitsKeyListener(true,true));
1
joe1327

Essayez d’utiliser Android:numeric="integer" dans votre vue EditText.

0
codinguser