web-dev-qa-db-fra.com

EditText avec clavier numérique par défaut, mais autorisant les caractères alphabétiques

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?

75
Frank Bozzo

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

enter image description here

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>
11
Sherif elKhatib

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)

10
Terel

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.

10
Diego Santamaria

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.

8
Alpay

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:

  • texte
  • textCapCharacters
  • textCapWords
  • textCapSentences
  • textAutoCorrect
  • textAutoComplete
  • textMultiLine
  • textImeMultiLine
  • textNoSuggestions
  • textUri
  • textEmailAddress
  • textEmailSubject
  • textShortMessage
  • textLongMessage
  • textPersonName
  • textPostalAddress
  • textPassword
  • textVisiblePassword
  • textWebEditText
  • textFilter
  • textPhonetic
  • nombre
  • nombreSigné
  • nombreDécimal
  • téléphone
  • date/heure
  • rendez-vous amoureux
  • temps

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"/>
5
Paresh Mayani

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.

4
Shaista Naaz

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.

2
iDroid Explorer

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">

2
Naveed Ahmad

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.

2
dilix

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.

2
slaman

Pourquoi ne pas simplement avoir un bouton à bascule qui soit:

  • Définit le type d'entrée pour n'autoriser que les valeurs numériques
  • Définit le type d'entrée pour autoriser l'utilisation du clavier QWERTY
  • Ou définissez d'autres types d'entrée (si nécessaire)

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.

1
dabaerju

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" />
0
Ms. B

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);
        }
    }
}
0
Rico Teng

Vous pouvez essayer de mettre ---

editText.setRawInputType(Configuration.KEYBOARD_QWERTY);

pour plus de description

0
Swati

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;
    }
});
0
oskarko

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.

0
jmcdonnell40