J’ai une zone EditText et je souhaite que le clavier par défaut apparaisse lorsqu’il est sélectionné pour être le pavé numérique, car la plupart du temps, les utilisateurs entreront des chiffres. Cependant, je souhaite autoriser les utilisateurs à saisir aussi des caractères alphabétiques, le cas échéant. Utiliser android:inputType="number"
limite la saisie aux chiffres uniquement. Quelles sont mes options?
Je suggère une solution plus robuste:
Présenter à l’utilisateur la possibilité de choisir le type d’entrée:
FIXES REQUISES
– Meilleure gestion de l’affichage / masquage des boutons de sélection d’entrée
– probablement supprimer les suggestions lorsque le type d’entrée est lettre
Voici l’activité:
package mobi.sherif.numberstexttextview; import android.os.Bundle; import android.app.Activity; import android.text.InputType; import android.view.View; import android.view.View.OnFocusChangeListener; import android.widget.EditText; public class MainActivity extends Activity { EditText mEdit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEdit = (EditText) findViewById(R.id.input); mEdit.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean focused) { findViewById(R.id.llmenu).setVisibility(focused?View.VISIBLE:View.GONE); } }); } public void onNumbers(View v) { mEdit.setInputType(InputType.TYPE_CLASS_NUMBER); } public void onLetters(View v) { mEdit.setInputType(InputType.TYPE_CLASS_TEXT); } }
Voici l’activité xml: activity_main.xml
Voici ce que vous recherchez:
Définissez votre EditText
dans votre EditText
XML de la manière suivante:
Et appelez suivant dans votre onCreate()
:
etTest = (EditText) findViewById(R.id.etTest); etTest.setRawInputType(InputType.TYPE_CLASS_NUMBER); // Note the "Raw"
Chaque fois que vous cliquez dans votre EditText
maintenant, vous pouvez entrer des chiffres ET des lettres ! (Le clavier numérique est affiché en premier)
Malheureusement, ce n’est pas possible, car un seul inputType peut être défini pour un EditText. Les éléments suivants ne montreront que des caractères alphabétiques sur les boutons.
Cependant, ce que je peux vous suggérer, définissez votre type de saisie sur numérique et ajoutez simplement un petit bouton switchKeyboard sur votre formulaire près du pavé numérique. Et mettre son onClick
editText1.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
pour que les utilisateurs puissent également utiliser des caractères alphabétiques.
Définissez votre EditText dans votre fichier XML de la manière suivante:
sortie: android: inputType = “textVisiblePassword”
Une rangée de chiffres et le rest des lettres.
EditText inputtype est utilisé pour définir le type d’entrée dans votre EditText.
Les valeurs possibles pour l’ android:inputtype
sont:
alors vous pouvez utiliser n’importe quelle valeur en montrant par exemple:
Asus Tablet a cette fonctionnalité, ils ont personnalisé le clavier par défaut. Et le clavier contient uniquement les chiffres et les alphabets. Je pense que votre solution d’exigence est aussi de personnaliser le clavier par défaut
Vous pouvez suivre la réponse de Paresh Mayani.
Et dans les conseils, vous pouvez utiliser android:inputType="textPhonetic"
pour le texte et le numéro inputType en fonction de la sélection de l’utilisateur.
J’espère que vous aurez mon point.
Dans OnCreate in Activity, faites ceci:
t = (EditText) findViewById(R.id.test); t.setKeyListener(new KeyListener() { @Override public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) { return false; } @Override public boolean onKeyOther(View view, Editable text, KeyEvent event) { return false; } @Override public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) { if (keyCode == 67) { // Handle backspace button =) if (text.length() > 0) { t.setText(text.subSequence(0, text.length() - 1)); t.setSelection(text.length()-1); } } return false; } @Override public int getInputType() { return InputType.TYPE_CLASS_NUMBER; } @Override public void clearMetaKeyState(View view, Editable content, int states) { } });
Dans ce cas, vous tapez le number
et Android affichera le clavier numérique, mais vous pouvez saisir ce que vous voulez. Vous pouvez également outrepasser d’autres méthodes comme vous le souhaitez.
Voici comment je l’ai réalisé …
android: inputType = “textPhonetic | numberDecimal” android: digits = “/ 0123456789.abcdefghijklmnopqrstuvwxyz”
Seuls les caractères spécifiés par des chiffres seront autorisés.
Veuillez noter que le clavier affiché est celui du numéroteur, pas le clavier typique. Pour moi, il a atteint tout ce dont j’avais besoin dans le XML.
Vous ne devez utiliser aucun filtre inputType dans ce cas, ajoutez simplement la ligne ci-dessous dans votre propriété EditText.
android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "
Maintenant, seuls ces caractères seront autorisés à entrer dans le EditText. Le code complet de votre edittext sera comme suit:
Pourquoi ne pas avoir un bouton à bascule qui soit:
De cette façon, vous pouvez définir le pavé numérique sur la valeur par défaut, puis l’utilisateur peut le modifier en appuyant sur un bouton.
Ceci n’est pas possible étant donné les types d’entrées Android par défaut actuels sur différents téléphones.
Il existe de nombreux hacks possibles sur certains claviers, mais pas sur d’autres , comme la méthode habituelle de définition du type d’entrée brute généralement incluse dans les réponses:
editText.setRawInputType(InputType.TYPE_CLASS_NUMBER)
Le meilleur conseil que je puisse trouver est d’utiliser le type d’entrée textPostalAddress
dans votre XML:
android:inputType="textPostalAddress"
Malheureusement, cela ne fait pas encore ce que nous voulons, mais peut-être le fera-t-il dans le futur . Le seul avantage de ceci est que les méta-informations de votre boîte d’édition reflèteront ce que vous avez l’intention de faire.
Sur le plan de la programmation, il est possible de modifier légèrement le stream habituel. Vous devez d’abord définir editText comme:
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
Ensuite, vous devez écouter pour Keyevent. En appuyant sur pound, définissez à nouveau InputType sur InputType.TYPE_CLASS_TEXT. Cela devrait fonctionner comme cela fonctionne pour moi.
editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Auto-generated method stub Log.d("KeyBoard", "Keyboard Test Key Hit"); switch (keyCode) { KeyEvent.KEYCODE_POUND: if(editText.setInputType(InputType.TYPE_CLASS_TEXT); { editText.setInputType(InputType.TYPE_CLASS_TEXT); return true; } } } }
Vous pouvez essayer de paramétrer —
editText.setRawInputType(Configuration.KEYBOARD_QWERTY);
pour plus de description
Dans votre code pour textView, supprimez le “texte” dans Android: inputType.
CA devrait etre,
Vous pouvez le faire par programmation:
// Numbers mEditText.setInputType(InputType.TYPE_CLASS_NUMBER); // Text mEditText.setInputType(InputType.TYPE_CLASS_TEXT);
setInputType (int type) Définit le type du contenu avec une constante comme défini pour inputType.
Comme le dit Saurav, la meilleure façon de changer entre le clavier QWERTY et Numeric Keyborad avec un simple auditeur:
input.setInputType(InputType.TYPE_CLASS_TEXT); input.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { switch (keyCode) { case 24: // Volumen UP input.setInputType(InputType.TYPE_CLASS_NUMBER); break; case 25: // Volumen DOWN input.setInputType(InputType.TYPE_CLASS_TEXT); break; } return true; } });
J’essaie toute la méthode mais pas parfaite. J’ai donc une autre idée. Travaillez parfaitement pour tous les claviers.
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_reset_password); editText.setRawInputType(InputType.TYPE_CLASS_NUMBER); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Checks whether a hardware keyboard is available if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) { Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show(); if (editText.isFocused()) { editText.setInputType(InputType.TYPE_CLASS_TEXT); } } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) { Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show(); if (editText.getInputType() == InputType.TYPE_CLASS_TEXT) { editText.setInputType(InputType.TYPE_CLASS_NUMBER); } } }
Dans votre présentation xml pour EditText, ajoutez ce paramètre:
android:inputType="number|text"
Cela permettra à l’utilisateur d’entrer à la fois du texte et du numéro et contient la logique dans le fichier XML plutôt que d’avoir du code dans votre activité ou votre fragment.