2014-09-28 61 views
2

一個EditText我使用一個EditText針對我有以下要求的輸入濾波器:使用輸入濾波器,用於在機器人

1)第一個字符不應該是一個數字 2)從第二個字符起字母,數字,下劃線和點被允許

我從一個帖子下面的代碼:

filter_username = new InputFilter() { 
     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
       boolean keepOriginal = true; 
       sb = new StringBuilder(end - start); 
       for (int i = start; i < end; i++) { 

        char c = source.charAt(i); 
//     testString.append(c); 
        if (isCharAllowed2(c)) // put your condition here 
         sb.append(c); 
        else 
         keepOriginal = false; 
       } 
       if (keepOriginal) 
        return null; 
       else { 
        if (source instanceof Spanned) { 
         SpannableString sp = new SpannableString(sb); 
         TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0); 
         return sp; 
        } else { 
         return sb; 
        }   
       } 
      } 

      private boolean isCharAllowed2(char c) { 
       if(sb.length()==0) 
       { 
         return Character.isLetter(c); 
       } 
       else 
       { 
       return (Character.isLetter(c)||Character.isDigit(c)||c=='_'||c=='.'); 
       } 

      } 

}; 

我只能夠輸入letters.The的問題,我認爲是這樣的線路:

sb = new StringBuilder(end - start); 

每當我按下鍵時,都會創建一個新的Stringbuilder對象。因此它的長度將爲零,並且僅返回字母的第一個條件。

所以我想設置stringbuilder到另一個變量。它的工作部分,但是當我按下退格鍵,並清除文本,該新變量的值也必須清除。我該如何解決它?

回答

0

嘗試使用textwatcher來驗證輸入

TextWatcher的方法用戶進入或刪除一個字符後afterTextChanged將被稱爲每次。您可以驗證輸入的基礎(在代碼中給出),然後在用戶輸入無效字符時顯示錯誤。

edittext.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) {} 

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

     @Override 
     public void afterTextChanged(Editable s) { 
      String text = edittext.getText().toString(); 
      String len = text.length(); 

      if(Character.isDigit(text.charAt(0))){ 
       //First letter is a digit. Do something 
       //Show an error 
      } 

      text.substring(1); //remove first character from string 

      if(text.matches("^[a-zA-Z0-9_.]+$"){ 
       //contains invalid character (listed by you) 
       //it contains a character among a-z, A-Z, 0-9, _ or . 
       //show an error 
      } 

     } 
    }); 

所以,如果你發現任何無效的字符,你可以向用戶顯示一個錯誤,並阻止他繼續。

0

InputFilter用法是在文檔解釋說:緩衝區時,要更換範圍DSTART ......從範圍開始新的文本dest的DEND ...源的結束

該方法被調用。返回您希望放置在那裏的CharSequence,如果合適的話包括空字符串,或者返回null以接受原始替換。注意不要拒絕0長度替換,因爲這是刪除文本時會發生的情況。另外要注意,你不應該試圖用這種方法對dest進行任何修改;你只能在上下文中檢查它。注意:如果source是Spanned或Spannable的實例,則應將源中的跨度對象複製到過濾結果中(即非空返回值)。爲方便起見,可以使用copySpansFrom(Spanned,int,int,Class,Spannable,int)。

所以,剛剛回歸""阻止不需要的字符:

public class MyTextFilter implements InputFilter { 

    @Override 
    public CharSequence filter(CharSequence charSequence, int i, int i2, Spanned spanned, int i3, int i4) { 

     // delete support 
     if(charSequence.length() < 1){ 
      return null; 
     } 

     // allow only if replacement has valid pattern. 
     if (i3 == 0) { 
      return charSequence.toString().matches("\\d[\\w\\._\\d]?") ? null : ""; 
     } else { 
      return charSequence.toString().matches("[\\w\\._\\d]?") ? null : ""; 
     } 
    } 
} 

此外,上述19 API,你可以使用Character.isAlphabetic()方法。