2017-03-21 1 views
0

Ich versuche, mein EditText-Feld in meiner App einige Einschränkungen zu setzen. Für den vollständigen Namen und einige andere Felder möchte ich nur Buchstaben, Leerzeichen und einige andere Zeichen wie '.' oder '-'.Validieren von EditText View auf TextChanged

sah ich ein paar Sachen online und dies zusammen:

mFullnameView = (EditText) findViewById(R.id.activity_register_et_fullname); 
TextWatcher fullnameTextWatcher = new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable s) { 
     validate(s.toString()); 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     // 
    } 

    private void validate(String s) { 
     if (!(Pattern.matches("^[A-Za-z\\s]{1,}[\\.]{0,1}[A-Za-z\\s]{0,}$", s))) { 
      if (s.length() > 0) { 
       final String cleanText = s.substring(0, s.length()); 
       mFullnameView.setText(cleanText); 
      } 
     } 
    } 
}; 

aber jetzt meine Anwendung friert für ein paar Sekunden und dann stürzt ab, wenn ich einen Versuch Eingabe von „“ Im EditText-Feld weiß ich nicht, warum dies geschieht oder wie es gelöst wird.

+0

Es könnte einfacher sein, einfach einzuschränken, was der Benutzer am EditText eingeben kann, damit Sie nicht versuchen müssen, zu validieren. Wie hier: http://stackoverflow.com/a/23212485/2128028 – Everett

Antwort

1

Wenn Sie den Text in TextWatcher ändern, ruft die Methode in TextWatcher erneut auf. Sie sollten also rekursive Aufrufe vermeiden oder InputFilter verwenden.

InputFilter[] filters = new InputFilter[1]; 
    filters[0] = new InputFilter() { 
     @Override 
     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
      if (source == null) return null; 
      Pattern p = Pattern.compile("^[A-Za-z\\s]{1,}[\\.]{0,1}[A-Za-z\\s]{0,}$"); 
      Matcher m = p.matcher(source.toString()); 
      StringBuilder builder = new StringBuilder(); 
      while (m.find()) { 
       builder.append(m.group()); 
      } 
      return builder.toString(); 
     } 
    }; 
    mFullnameView.setFilters(filters); 
Verwandte Themen