2012-09-07 66 views
4

當我在EditText上使用方法來處理特殊字符時,maxLength屬性未按預期工作。我的代碼如下。當使用setFilters時,EditText maxLength屬性應用不正確

editName = (EditText)findViewById(R.id.rna_editTextName); 
     editName.setFilters(new InputFilter[]{getFilteredChars()}); 


     //Below method returns filtered characters. 
     public InputFilter getFilteredChars() 
     { 
      InputFilter filter = new InputFilter() 
      { 
       @Override 
        public CharSequence filter(CharSequence source, int start, int end,        Spanned dest, int dstart, int dend) { 
         if (end > start) { 

          char[] acceptedChars = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ' ,'.', '\''}; 

          for (int index = start; index < end; index++) {           
           if (!new String(acceptedChars).contains(String.valueOf(source.charAt(index)))) { 
            return ""; 
           }    
          } 
         } 
         return null; 
       } 
     }; 
     return filter; 
     } 
+0

定義「不按預期工作」 – HaemEternal

+0

我想處理edittext上的特殊字符問題,我在上面添加了方法,即getfilteredChars()。通過使用這種方法可以處理特殊字符問題,但是該edittext接受無限制字符。同時以編程方式設置edittext的maxlenth屬性,我們使用InputFilters,這裏也在getfilters中使用Inputfilters,所以我認爲那個maxlenth屬性的becoz是nt工作的。所以告訴我解決這個問題的方法。 – user1242611

+0

任何問題的解決方案 –

回答

0

而設置的EditText的maxlenth財產編程

請出示使用的代碼。

野性猜測:問題可能是您在佈局中設置了maxLength。通過調用setFilters(),該行爲將被您的Filter所取代。

解決方案: 在您的getFilteredChars()過濾器中使用多一個過濾器或實現maxLenght行爲。

編輯: 你可能想看看http://developer.android.com/reference/android/text/InputFilter.LengthFilter.html

,併爲您的評論質疑, 從DOC:

when the buffer is going to replace the range dstart … dend of dest with the new text from the range start … end of source 

因此,像(僞代碼liveCoding):

dest.lenght - (dend-dstart) + (end-start) = new legnth 
+0

但是如何在你的getFilteredChars()過濾器中實現maxLenght行爲?請解釋一下。 – user1242611

14

這是因爲maxLength屬性設置爲InputFilter在你的EditText。通過調用EditText.setFilters(new InputFilter[] {<YOUR_FILTER>}),您將覆蓋所有現有的InputFilter,包括maxLength所使用的InputFilter。

爲了解決這個問題,通過複製返回EditText.getFilters()數組和你自己添加到它:

InputFilter[] editFilters = edit.getFilters(); 
InputFilter[] newFilters = new InputFilter[editFilters.length + 1]; 
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length); 
newFilters[editFilters.length] = <YOUR_FILTER>; 
edit.setFilters(newFilters); 
3

試試這個代碼。基於@Jozua回答

/** 
* Adds filter to EditText preserving other filters. 
* 
* @param editText 
* @param filter 
*/ 
public static void setFilter(EditText editText, InputFilter filter) { 
InputFilter curFilters[] = editText.getFilters(); 

if (curFilters != null) { 
    InputFilter newFilters[] = new InputFilter[curFilters.length + 1]; 
    System.arraycopy(curFilters, 0, newFilters, 0, curFilters.length); 
    newFilters[curFilters.length] = filter; 
    editText.setFilters(newFilters); 
} else { 
    editText.setFilters(new InputFilter[] { filter }); 
} 
} 
0

您可以在數組中添加多個過濾器。 像editText中的最大字符限制和特殊字符過濾器一樣。

editText.setFilters(new InputFilter [] {new InputFilter.LengthFilter(MAX_CHARACTER_LIMIT),SpecialCharacterInputFilter});

相關問題