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.
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 });
elle est la solution travail pour moi:
Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
Android:inputType="textFilter"
Ajoutez-le dans le texte d'édition dans un fichier XML
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() }
})
Essaye ça
Utilisez Android:digits
n'incluez pas "" (espace)
<EditText
Android:inputType="number"
Android:digits="0123456789.abcdefghijklmnl....."// write character that you want to allow
/>
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 "";
}
}
});
Il suffit de remplacer ceci dans votre code et cela devrait fonctionner parfaitement,
etPass.setText(etPass.getText().toString().replaceAll(" ",""));
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);
}
}
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);
}
})
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());
}
}
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());
}