Je développe une application pour clavier, mais j'obtiens un problème ... Je souhaite limiter/bloquer certains caractères spéciaux du clavier logiciel dans EditText sous Android par programme.
Alors, y a-t-il un moyen de restreindre la saisie de caractères spéciaux dans le texte de montage sous Android?.
Si quelqu'un a une idée, répondez s'il vous plaît.
Merci d'avance.
Essayez cela peut fonctionner pour vous
public class MainActivity extends Activity {
private EditText editText;
private String blockCharacterSet = "~#^|$%&*!";
private InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source != null && blockCharacterSet.contains(("" + source))) {
return "";
}
return null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
editText.setFilters(new InputFilter[] { filter });
}
}
check this link qui montre Comment limiter les caractères spéciaux d’un champ Android EditText
Essayez ce code Android:digits="abcde.....012345789"
Je suppose que c'est le moyen le plus simple de le faire.
Cela devrait fonctionner:
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.isLetterOrDigit(source.charAt(i))) {
return "";
}
}
return null;
}
};
edit.setFilters(new InputFilter[]{filter});
Ou si vous préférez la solution de facilité:
<EditText Android:inputType="text" Android:digits="0123456789*,qwertzuiopasdfghjklyxcvbnm" />
Si vous souhaitez ajouter des espaces, vous pouvez laisser des espaces après le dernier chiffre.
Android:digits="0123456789qwertzuiopasdfghjklyxcvbnm "
Pour ceux qui pourraient être confrontés à des problèmes lors de l'ajout d'espace, veuillez ajouter un espace avec tous les alphabets. Vous trouverez ci-dessous un exemple .__ Vous devez également savoir que l'utilisateur ne pourra pas ajouter de nouvelle ligne dans ce cas.
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:inputType="text"
Android:digits="0123456789,a bcdefghijklmnopqrstuvwxyz"
Android:maxLines="1"
Android:singleLine="true" />
Sa fin, mais peut être utile pour les autres . Au lieu de la programmation, vous pouvez aller avec l'attribut xml. Il se peut que, dans la mise en page unique, vous disposiez de nombreux editText, parmi lesquels vous souhaitez limiter les caractères spéciaux uniquement dans un seul EditText. Donc, définir en XML vous aidera. Voici le code pour restreindre les caractères spéciaux en leur permettant d'entrer uniquement des alphabets et des chiffres comme ci-dessous
<EditText
Android:id="@+id/editText"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textSize="@dimen/text10"
Android:singleLine="true"
Android:maxLines="1"
Android:maxLength="16"
Android:digits="abcdefghijklmnopqrstuvwxyz0123456789"/>
Vous pouvez créer une expression régulière et la vérifier sur la méthode onTextChanged
yourEditText.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
// you can call or do what you want with your EditText here
yourEditText. ...
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
Malheureusement, la solution acceptée ne fonctionne pas dans tous les cas. La solution appropriée consisterait à utiliser la InputFilter
suivante:
private InputFilter filter = new InputFilter() {
// An example pattern that restricts the input only to the lowercase letters
private static final Pattern restrictedChars = Pattern.compile("[a-z]*")
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
final CharSequence replacementText = source.subSequence(start, end);
final CharSequence replacedText = dest.subSequence(dstart, dend);
if (source == null || restrictedChars.matcher(replacementText).matches()) {
return null; // Accept the original replacement
}
return replacedText; // Keep the original text
}
};
Cette solution diffère de celle acceptée en ce sens qu'elle résout les problèmes suivants:
Il faut d’abord ajouter DigitsKeyListener pour autoriser les caractères, puis définir setRawInputType sur le champ edittext
edit_field.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
edit_field.setRawInputType(InputType.TYPE_TEXT_VARIATION_PERSON_NAME);
vous pouvez empêcher pour la saisie de caractères spéciaux:
yourEditText.addTextChangedListener(new TextWatcher() {
CharSequence previous;
public void afterTextChanged(Editable s) {
if(s.toString().contains("&^%$#*&(")){
s.clear();
s.append(previous.toString());
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
previous = s;
}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
});