web-dev-qa-db-fra.com

Android désactiver l'espace uniquement pour Edittext

Dans mon application Android, je dois désactiver uniquement la barre d'espace. Mais je n'ai pas trouvé de solution à ce problème. Je dois désactiver la barre d'espace et lorsque l'utilisateur entre l'espace ne devrait pas fonctionner, les caractères spéciaux, les lettres, les chiffres et tous les autres devraient fonctionner. Ce que j'ai essayé, c'est

etPass.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub
                String str = s.toString();
                if(str.length() > 0 && str.contains(" "))
                {
                    etPass.setError("Space is not allowed");
                    etPass.setText("");
                }
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                                          int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

            }
        });

Mais le problème, c’est que lorsque l’espace vient, tout le texte est supprimé. j'ai enlevé 

etPass.setText("");

cette ligne, donc à ce moment le message d'erreur est affiché, mais à ce moment-là, l'utilisateur peut toujours être capable de taper de l'espace. Mais ce dont j'ai besoin, c'est que l'utilisateur ne devrait pas être capable de taper l'espace.

15
roshanpeter

Pourquoi ne pensez-vous pas à un filtre de caractère? Voici un exemple d'extrait de code.

/* To restrict Space Bar in Keyboard */
InputFilter filter = new InputFilter() {
    public CharSequence filter(CharSequence source, int start, int end,
            Spanned dest, int dstart, int dend) {
        for (int i = start; i < end; i++) {
            if (Character.isWhitespace(source.charAt(i))) {
                return "";
            }
        }
        return null;
    }

};
input.setFilters(new InputFilter[] { filter });
33
Don Chakkappan

elle est la solution travail pour moi:

Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
Android:inputType="textFilter"

Ajoutez-le dans le texte d'édition dans un fichier XML

32
SAndroidD

Cette version prend en charge les suggestions du clavier avec des espaces.

InputFilter filter = new InputFilter() {
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String filtered = "";
        for (int i = start; i < end; i++) {
            char character = source.charAt(i);
            if (!Character.isWhitespace(character)) {
                filtered += character;
            }
        }

        return filtered;
    }

};

input.setFilters(new InputFilter[] { filter });

PS: Kotlin version:

input.filters = arrayOf(InputFilter { source, _, _, _, _, _ ->
    source.toString().filterNot { it.isWhitespace() }
})
9
Kevin Robatel

Essaye ça

Utilisez Android:digits n'incluez pas "" (espace)

<EditText
    Android:inputType="number"
    Android:digits="0123456789.abcdefghijklmnl....."// write character that you want to allow
/>
4
N J
EditText yourEditText = (EditText) findViewById(R.id.yourEditText);
yourEditText.setFilters(new InputFilter[] {
new InputFilter() {
    @Override
    public CharSequence filter(CharSequence cs, int start,
                int end, Spanned spanned, int dStart, int dEnd) {
        // TODO Auto-generated method stub
        if(cs.equals("")){ // for backspace
             return cs;
        }
        if(cs.toString().matches("[a-zA-Z]+")){ // here no space character
             return cs;
        }
        return "";
    }
}
});
4
johnrao07

Il suffit de remplacer ceci dans votre code et cela devrait fonctionner parfaitement,

etPass.setText(etPass.getText().toString().replaceAll(" ",""));
1
Madhur

Pour désactiver l'utilisation de l'espace

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (editclicked) {
        if (keyCode == KeyEvent.KEYCODE_SPACE) {
            return false
        }
    } else {
        super.onKeyDown(keyCode, event);
    }
}
1
Sunny

J'ai essayé d'utiliser la solution InputFilter et cela ne fonctionne pas car si vous essayez de toucher le retour arrière, le texte saisi est doublé dans la EditText

Cette solution fonctionne pour moi dans Kotlin en utilisant TextWatcher:

editText.addTextChangedListener(object : TextWatcher {
    override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {          }

    override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
    }

    override fun afterTextChanged(p0: Editable?) {
        val textEntered = editText.text.toString()

        if (textEntered.isNotEmpty() && textEntered.contains(" ")) {
            editText.setText(editText.text.toString().replace(" ", ""));
            editText.setSelection(editText.text.length);
        }
    })
1
pableiros

Dans la méthode afterTextChanged, insérez le code suivant:

  public void afterTextChanged(Editable s) {

        String str = etPass.getText().toString();
        if(str.length() > 0 && str.contains(" "))
        {
            etPass.setText(etPass.getText().toString().replaceAll(" ",""));
            etPass.setSelection(etPass.getText().length());
        }
    }
0
Moti

au lieu de etPass.setText("");, supprimez simplement l’espace des données EditText.

etPass.setText(etPass.getText().toString().trim());
etPass.setSelection(autoComplete.getText().length());

votre condition IF sera donc la suivante: 

if(str.length() > 0 && str.contains(" "))
{
    etPass.setError("Space is not allowed");
    etPass.setText(etPass.getText().toString().trim());
    etPass.setSelection(etPass.getText().length());
}
0
Ravi Rupareliya