zoukankan      html  css  js  c++  java
  • Android 之 设置EditText最大可输入字符

    Android 中的EditText最大可输入字符数可以通过xml文件中为EditText设置maxLength属性或者在代码中为EditText设置LengthFilter来设置。

    例如要设置EditText只能输入10个字符

    xml中:

    1. <EditText  android:layout_width = "fill_parent"  
    2.     android:layout_height = "wrap_content"  
    3.     android:id = "@+id/mEdit"  
    4.     android:maxLength = "10"/>  
    1. <EditText  android:layout_width = "fill_parent"  
    2.     android:layout_height = "wrap_content"  
    3.     android:id = "@+id/mEdit"  
    4.     android:maxLength = "10"/>  

    代码中:

    1. EditText mEdit = (EditText)findViewById(R.id.mEdit);  
    2. InputFilter[] filters = {new LengthFilter(10)};  
    3. mEdit.setFilters(filters);  
    1. EditText mEdit = (EditText)findViewById(R.id.mEdit);  
    2. InputFilter[] filters = {new LengthFilter(10)};  
    3. mEdit.setFilters(filters);  


    以上任意一种方法都可以满足需求,但这种方法只能为EditText设置统一的最大可输入字符,如果碰到根据实际情况限制不同的可输入字符数时,这种方法就不能用了。

    比如SIM卡上的电话本姓名字段长度,纯英文下允许输入17个字符,而中文则只可以输入6个字符。此时可以重写InputFilter类来实现。

    即:

    1. EditText mEdit = (EditText)findViewById(R.id.mEdit);          
    2. InputFilter[] filters = {new AdnNameLengthFilter()};  
    3. mEdit.setFilters(filters);  
    4. public static class AdnNameLengthFilter implements InputFilter  
    5.     {  
    6.         private int nMax;  
    7.   
    8.         public  CharSequence filter (CharSequence source, int start, int end, Spanned dest, int dstart, int dend)  
    9.         {  
    10.             Log.w("Android_12""source("+start+","+end+")="+source+",dest("+dstart+","+dend+")="+dest);  
    11.   
    12.             if(isChinese(dest.toString())|| isChinese(source.toString()))  
    13.             {  
    14.                 nMax = LENGTH_ZNAME;  
    15.             }else  
    16.             {  
    17.                 nMax =LENGTH_ENAME;  
    18.             }  
    19.               
    20.                 int keep = nMax - (dest.length() - (dend - dstart));  
    21.   
    22.                 if (keep <= 0) {  
    23.                     return "";  
    24.                 } else if (keep >= end - start) {  
    25.                     return null// keep original  
    26.                 } else {  
    27.                     return source.subSequence(start, start + keep);  
    28.                 }  
    29.           
    30.         }  
    31.     }  
    1. EditText mEdit = (EditText)findViewById(R.id.mEdit);          
    2. InputFilter[] filters = {new AdnNameLengthFilter()};  
    3. mEdit.setFilters(filters);  
    4. public static class AdnNameLengthFilter implements InputFilter  
    5.     {  
    6.         private int nMax;  
    7.   
    8.         public  CharSequence filter (CharSequence source, int start, int end, Spanned dest, int dstart, int dend)  
    9.         {  
    10.             Log.w("Android_12""source("+start+","+end+")="+source+",dest("+dstart+","+dend+")="+dest);  
    11.   
    12.             if(isChinese(dest.toString())|| isChinese(source.toString()))  
    13.             {  
    14.                 nMax = LENGTH_ZNAME;  
    15.             }else  
    16.             {  
    17.                 nMax =LENGTH_ENAME;  
    18.             }  
    19.               
    20.                 int keep = nMax - (dest.length() - (dend - dstart));  
    21.   
    22.                 if (keep <= 0) {  
    23.                     return "";  
    24.                 } else if (keep >= end - start) {  
    25.                     return null// keep original  
    26.                 } else {  
    27.                     return source.subSequence(start, start + keep);  
    28.                 }  
    29.           
    30.         }  
    31.     }  

    其中的isChinese函数是判断是否字符串中是否包含中文字符,具体实现方法就不再赘述了。

    LENGTH_ZNAME : 是中文模式下允许输入的最大字符数。

    LENGTH_ENAME:是纯英文模式下允许输入的最大字符数。

    android怎样判断EditText输入的值是数字还是汉字 ,并限定输入字数
    2011-11-25 10:37

    判断汉字的方法private boolean isChinese(char c) {
            Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
            if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
                 || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
                || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
                return true;
            }
            return false;
        }

    数字就根据unicode的范围判断吧!

    方法一:利用TextWatcher


    editText.addTextChangedListener(new TextWatcher() {   
               private CharSequence temp;   
               private boolean isEdit = true;   
               private int selectionStart ;   
               private int selectionEnd ;   
               @Override  
               public void beforeTextChanged(CharSequence s, int arg1, int arg2,   
                       int arg3) {   
                   temp = s;   
               }   
                  
               @Override  
               public void onTextChanged(CharSequence s, int arg1, int arg2,   
                       int arg3) {   
               }   
                  
               @Override  
               public void afterTextChanged(Editable s) {   
                    selectionStart = editText.getSelectionStart();   
                   selectionEnd = editText.getSelectionEnd();   
                   Log.i("gongbiao1",""+selectionStart);   
                   if (temp.length() > Constant.TEXT_MAX) {   
                       Toast.makeText(KaguHomeActivity.this,   
                               R.string.edit_content_limit, Toast.LENGTH_SHORT)   
                               .show();   
                       s.delete(selectionStart-1, selectionEnd);   
                       int tempSelection = selectionStart;   
                       editText.setText(s);   
                       editText.setSelection(tempSelection);   
                   }   
               }   
      
      
           }); 

     private TextWatcher mTextWatcher = new TextWatcher(){
      Toast mToast = null;
      public void beforeTextChanged(CharSequence s, int start, 
        int count,int after) {
      }

      public void onTextChanged(CharSequence s, int start, 
        int before,int count) {
      }
      
      public void afterTextChanged(Editable s) {
       int nSelStart = 0;
       int nSelEnd = 0;
       boolean nOverMaxLength = false;
       
       nSelStart = mEditText.getSelectionStart();
       nSelEnd   = mEditText.getSelectionEnd();
       
       nOverMaxLength = (s.length() > Constants.MAX_TEXT_INPUT_LENGTH) ? true : false;
       if(nOverMaxLength){
        if(null == mToast){
         mToast = Toast.makeText(mContext, 
           R.string.IDS_MSG_TEXT_OVER_MAXLENGTH, 
           Toast.LENGTH_SHORT);
        }
        mToast.show();
        
        s.delete(nSelStart - 1, nSelEnd);

        mEditText.setTextKeepState(s);//请读者注意这一行,保持光标原先的位置,而 mEditText.setText(s)会让光标跑到最前面,

                                                         //就算是再加mEditText.setSelection(nSelStart) 也不起作用
        }
      }
     };

    方法二:利用InputFilter

        


    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(100)});  //其中100最大输入字数 

    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(100)});  //其中100最大输入字数

    方法三:在XML中设定

    Xml代码 
    <EditText  
        .   
        .   
        .   
        Android:maxLength="100"  
    /> 

    =========================================================

    方法二:
             利用EditText可以设置filter的特性,自定义一个LengthFilter,当输入字数超过限制时 ,做出自定义的提示
              // 输入框限制输入字数
            InputFilter[] filters = new InputFilter[1];
            filters[0] = new InputFilter.LengthFilter(Constant.TEXT_MAX) {
                @Override
                public CharSequence filter(CharSequence source, int start, int end,
                        Spanned dest, int dstart, int dend) {
                    if (source.length() > 0 && dest.length() == Constant.TEXT_MAX) {
                        if ((System.currentTimeMillis() - toastTime) > interval) {
                            toastTime = System.currentTimeMillis();
                            Toast
                                    .makeText(KaguHomeActivity.this,
                                            R.string.edit_content_limit,
                                            Toast.LENGTH_SHORT).show();
                        }
                    }
                    if (dest.toString().equals(
                            getResources().getString(R.string.input_default_txt))) {
                        Bundle data = new Bundle();
                        data.putCharSequence("source", source);
                        Message message = textHandler.obtainMessage();
                        message.setData(data);
                        message.sendToTarget();
                    }

                    return super.filter(source, start, end, dest, dstart, dend);
                }
            };
            editText.setFilters(filters);
    private Handler textHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {

                Bundle data = msg.getData();
                CharSequence source = data.getCharSequence("source");
                editText.setTextColor(Color.BLACK);
                editText.setText(source);
                editText.setSelection(source.length());
            }
        };
    =============================================================

  • 相关阅读:
    括号序列
    单向TSP
    Black Box
    震惊!!!某初中生竟30min一蓝两紫一黑!!!
    荷马史诗
    SUFEQPRE
    UVA劲歌金曲
    UVA城市里的间谍
    饼图----插件
    折线图-----插件
  • 原文地址:https://www.cnblogs.com/merryjd/p/2856489.html
Copyright © 2011-2022 走看看