web-dev-qa-db-fra.com

Comment limiter mon entrée EditText à un caractère spécial tel que la barre oblique inverse (/), le tild (~), etc. à l'aide d'un clavier logiciel sous Android

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.

38
jagdish

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

}
73
Biraj Zalavadia

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.

17
i.n.e.f

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" />
17
Solenya

Si vous souhaitez ajouter des espaces, vous pouvez laisser des espaces après le dernier chiffre.

  Android:digits="0123456789qwertzuiopasdfghjklyxcvbnm "
13
Thirupathi

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" />
3
Hitesh Bisht

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"/>
3
Tara

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) {}
       });
2
Anil Bhatiya

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:

  • seule une sous-séquence de la source est le remplacement, pas la source complète
  • la source n'inclut pas nécessairement uniquement le texte nouvellement saisi, parfois il s'agit du texte intégral saisi jusqu'à présent
0
Marcin Jedynak

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);
0
UpendranathReddy

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) {}
   });
0
Prashant Jajal