Android 實現限制EditText輸入文字的數量


前段時間比較忙 沒來的及時分享出來.需求是這樣的要求用戶只能輸入12個字符或者6位中文的數據:作為一個菜鳥遇到這樣的問題第一反應就是 Android:maxLength="12"這么個屬性然而去測試發現中文也是十二個的瞬間被上司叫過去就是一頓說。沒辦法還得改方法可是作為菜鳥的我只知道這一個方法;只能去百度了打開百度以后發現大部分方法都是一樣都是用editText.addTextChangedListener()這個方法處理的;可是作為菜鳥的我對於這方法還是不熟悉於是運行過程中出現了各種問題。。幾近周折還是沒解決,時間實在趕沒辦法換個方法於是找到了這個方式editText.setFilters( new InputFilter[]{new InputFilter.LengthFilter(MAX_LENGTH) });一開始也是一對問題直到在http://www.android100.org/html/201406/03/16568.html網站找到了這么個方法

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)) && !Character.toString(source.charAt(i)) .equals("_") && !Character.toString(source.charAt(i)) .equals("-")) { 
                            return ""; 
                    } 
            } 
            return null; 
    } 
}; 
但是看不懂也不知道是什么意思啊一開始沒有管。。問題沒解決找了個大牛詢問最終得到了結果如下:
// 這個方法,返回空字符串,就代表匹配不成功,返回null代表匹配成功
public CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) 經過大牛的提點算是奔着完成任務寫代碼的方式實現了最終的需求代碼如下:
    mEditText.setFilters(new InputFilter[]{new InputFilter() {
            // 這個方法,返回空字符串,就代表匹配不成功,返回null代表匹配成功
            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                                       Spanned dest, int dstart, int dend) {
                // 獲取字符個數(一個中文算2個字符)
                if (getTextLength(dest.toString())
                        + getTextLength(source.toString()) >= MAX_LENGTH) {
                    return "";
                }
                return null;
            }
        }});

 getTextLength(String text);方法

 /**
     * 獲取字符數量 漢字占2個,英文占一個
     *
     * @param text
     * @return
     */
    public static double getTextLength(String text) {
        double length = 0;
        for (int i = 0; i < text.length(); i++) {
       // text.charAt(i)獲取當前字符是的chart值跟具ASCII對應關系255以前的都是英文或者符號之等而中文並不在這里面所以此方法可行</span>
         if (text.charAt(i) > 255) {
                length += 2;
            } else {
                length++;
            }
        }
        return length;
    }        

 

 

 

[html]  view plain  copy
 
 print ?
  1. mEditText.setFilters(new InputFilter[]{new InputFilter() {  
  2.             // 這個方法,返回空字符串,就代表匹配不成功,返回null代表匹配成功  
  3.             @Override  
  4.             public CharSequence filter(CharSequence source, int start, int end,  
  5.                                        Spanned dest, int dstart, int dend) {  
  6.                 // 獲取字符個數(一個中文算2個字符)  
  7.                 if (getTextLength(dest.toString())  
  8.                         + getTextLength(source.toString()) >= MAX_LENGTH) {  
  9.                     return "";  
  10.                 }  
  11.                 return null;  
  12.             }  
  13.         }});  
 
            
 getTextLength(String text);方法
[html]  view plain  copy
 
 print ?
  1. /**  
  2.     * 獲取字符數量 漢字占2個,英文占一個  
  3.     *  
  4.     * @param text  
  5.     * @return  
  6.     */  
  7.    public static double getTextLength(String text) {  
  8.        double length = 0;  
  9.        for (int i = 0; i < text.length(); i++) {  
[html]  view plain  copy
 
 print ?
  1. <span style="white-space:pre">    </span>//<span style="font-family: 'Microsoft YaHei', 微軟雅黑, 'Microsoft JhengHei', 華文細黑, STHeiti, MingLiu;">text.charAt(i)獲取當前字符是的chart值跟具ASCII對應關系255以前的都是英文或者符號之等而中文並不在這里面所以此方法可行</span>  
  2.          if (text.charAt(i) > 255) {  
  3.                 length += 2;  
  4.             } else {  
  5.                 length++;  
  6.             }  
  7.         }  
  8.         return length;  
  9.     }  
代碼還有進步的空間有什么問題請及時提出

 

 
0
 
0
 
 
 

我的同類文章

 

參考知識庫

img

Android知識庫

猜你在找
查看評論

  暫無評論

 
 
發表評論
  • 用 戶 名:
  • firelightdragon
  • 評論內容:
  • 插入代碼
      
* 以上用戶言論只代表其個人觀點,不代表CSDN網站的觀點或立場
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM