J'ai une boîte de texte d'édition et je veux que le clavier par défaut qui apparaît quand il est sélectionné soit le clavier numérique, car la plupart du temps les utilisateurs entreront des chiffres. Cependant, je souhaite autoriser les utilisateurs à saisir également des caractères alphabétiques s'ils en ont besoin. L'utilisation de Android:inputType="number"
limite la saisie aux chiffres uniquement. Quelles sont mes options?
Je suggérerais une solution plus robuste:
Présenter à l'utilisateur la possibilité de choisir le type d'entrée:
BESOINS FIXES
-meilleure gestion de l'affichage/masquage des boutons de sélection d'entrée
-supprime probablement 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 le code XML de l'activité: activity_main.xml
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<ScrollView
Android:id="@+id/scrollview"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_alignWithParentIfMissing="true"
Android:layout_above="@+id/llmenu" >
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content" >
<EditText
Android:id="@+id/input"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:inputType="number" >
<requestFocus />
</EditText>
</LinearLayout>
</ScrollView>
<LinearLayout
Android:id="@+id/llmenu"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:background="#000000"
Android:padding="0dp" >
<Button
Android:id="@+id/buttonnumbers"
Android:layout_width="0dp"
Android:onClick="onNumbers"
Android:layout_height="match_parent"
Android:layout_weight="1"
Android:text="Numbers" />
<Button
Android:id="@+id/buttonletters"
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"
Android:onClick="onLetters"
Android:text="Letters" />
</LinearLayout>
</RelativeLayout>
Voici ce que vous recherchez:
Définissez votre EditText
dans votre fichier XML de cette manière:
<EditText
Android:id="@+id/etTest"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:ems="10"
Android:hint="@string/hint">
</EditText>
Et appelez le suivant dans votre onCreate()
:
etTest = (EditText) findViewById(R.id.etTest);
etTest.setRawInputType(InputType.TYPE_CLASS_NUMBER);
// Note the "Raw"
Chaque fois que vous cliquez maintenant dans votre EditText
, vous pouvez entrer chiffres ET lettres ! (Le clavier numérique est affiché en premier)
Définissez votre EditText dans votre XML de cette façon:
<EditText
Android:id="@+id/txtOppCodigoCliente"
Android:inputType="textVisiblePassword"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:maxLength="11"
Android:hint="@string/strCodigoCliente"/>
sortie: Android: inputType = "textVisiblePassword"
Une rangée de chiffres et le reste des lettres.
Malheureusement, cela n’est pas possible, car un seul inputType peut être défini pour un EditText. Ce qui suit montre simplement les caractères alphabétiques sur les boutons.
<EditText
Android:id="@+id/editText1"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:inputType="text|number" />
Cependant, ce que je peux vous suggérer, c’est de définir votre type d’entrée numérique et d’ajouter un petit bouton switchKeyboard sur votre formulaire, à proximité du pavé numérique. Et mettre son onClick
editText1.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
afin que les utilisateurs puissent également basculer vers les caractères alphabétiques.
Fondamentalement, EditText type d'entrée est utilisé pour définir le type d'entrée dans votre EditText.
Les valeurs possibles pour le Android:inputtype
sont:
alors vous pouvez utiliser n'importe quelle valeur comme dans l'exemple:
<EditText Android:id="@+id/EditText01"
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:inputType="number"
Android:text="1212223"/>
La tablette Asus a cette fonctionnalité, ils ont personnalisé le clavier par défaut. Et le clavier contient les chiffres et les alphabets uniquement. Je pense que votre solution à vos besoins consiste aussi à 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 nombre inputType en fonction de la sélection de l'utilisateur.
J'espère que vous comprendrez ce que je veux dire.
Dans ce cas, vous ne devez utiliser aucun filtre inputType, 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 ceci:
<EditText
Android:id="@+id/etTest"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:ems="10"
Android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "
Android:hint="@string/hint">
Dans OnCreate in Activity, procédez comme suit:
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 saisissez number
et Android affiche le clavier numérique, mais vous pouvez saisir ce que vous voulez . Vous pouvez également remplacer les autres méthodes à votre guise.
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 présenté est celui du composeur, pas le clavier typique. Pour moi, il a réalisé ce dont j'avais besoin entièrement dans le langage XML.
Pourquoi ne pas simplement avoir un bouton à bascule qui soit:
De cette façon, vous pouvez définir le clavier numérique comme valeur par défaut, puis l'utilisateur peut le changer en appuyant sur un bouton.
Dans votre code pour textView, supprimez le "texte" dans Android: inputType.
CA devrait etre,
<EditText
Android:id="@+id/editText1"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:inputType="number" />
J'essaie toute la méthode mais pas parfaite ..__ J'ai donc une autre idée. Travail parfait 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);
}
}
}
Vous pouvez essayer de mettre ---
editText.setRawInputType(Configuration.KEYBOARD_QWERTY);
pour plus de description
Comme le dit Saurav, le meilleur moyen est de changer entre QWERTY Clavier et clavier numérique avec un simple écouteur:
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;
}
});
Vous pouvez le faire par programme:
// 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 telle que défini pour inputType.