• android输入限制



    title: 2016-5-30 Android输入验证
    tags: EditText,输入验证

    前言2

    使用EditText让用户输入文字时,需要对输入验证。除过验证是否有效的逻辑不同,EditText的基本交互是一样的:
    考虑到可能的copy,paste操作,输入整个单词,词语的可能,目标是新的字符如果无效,则文本无变化,光标无变化。

    TextWatcher

    这里使用TextWatcher实现对输入的限制。

    class BasicTextWatcher implements TextWatcher {
    	private int mLastCursorIndex;
    	private String mLastValidText = "";
    	private EditText mEditText;
    	
    	public BasicTextWatcher(EditText editText) {
    		mEditText = editText;
    	}
    	
    	@Override
    	public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    		mLastCursorIndex = mEditText.getSelectionEnd();
    	}
    	
    	@Override
    	public void onTextChanged(CharSequence s, int start, int before, int count) {	}
    	
    	@Override
    	public void afterTextChanged(Editable s) {
    		// TODO:输入在包含空格要替换掉。
    		String newText = s.toString().trim();
    		if (mLastValidText.equals(newText)) return;
    		
    		mEditText.removeTextChangedListener(this);
    	
    		if (validText(newText)) {
    			mLastValidText = newText;
    		} else {
    			// 输入无效,恢复文本,重置光标到之前位。	
    			mEditText.setText(mLastValidText);		
    			if (mLastCursorIndex > mLastValidText.length()) {
    				mLastCursorIndex = mLastValidText.length();
    			}
    			mEditText.setSelection(mLastCursorIndex);
    		}
    		mEditText.addTextChangedListener(this);
    	}
    	
    	/**
    	 * 验证输入的文本是否满足业务需要。
    	 * @param text 待验证文本。
    	 * @return true:文本有效,false:无效。
    	 * /
    	private boolean validText(String text) {
    		return true;
    	}
    };
    

    具体使用时定义继承BasicTextWatcher 的子类,重写validText即可。

    中文、数字和字母

    许多name、title、tag这样的概念,对文本的需求几乎都是“仅限中文、数字和字母,总长度不超过xx字符,一个汉字看做2字符”。

    class StringUtils {
    	/**
         * 判断字符是否为汉字,不包括符号。
         * @param c 待校验的字符。
         * @return 是否为汉字。
         */
        public static boolean isChineseWord(char c) {
            Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]");
            Matcher matcher = pattern.matcher(String.valueOf(c));
            return matcher.matches();
        }
        
    	/**
         * 判断传递的文本是否仅包含a-Z和A-Z这些字母。
         * @param text
         * @return
         */
        public static boolean isLetters(String text) {
            if (text == null || text.trim() == "") return false;
            for (int i = 0; i < text.length(); i++) {
                if (!((text.charAt(i) <= 'Z' && text.charAt(i) >= 'A')
                        || (text.charAt(i) <= 'z' && text.charAt(i) >= 'a'))) {
                    //字符不在A-Z或a-z之间,那么整个text就不全是字母
                    return false;
                }
            }
            return true;
        }
        
    	/**
         * 判断传递的文本是否仅包含a-Z和A-Z这些字母。
         * @param c
         * @return
         */
        public static boolean isLetters(char c) {
            if ((c <= 'Z' && c >= 'A')
                    || (c <= 'z' && c >= 'a')) {
                return true;
            }
            return false;
        }
    
    	/**
         * 计算text的长度,一个汉字按2个字符记。
         * @param text
         * @return
         */
        public static int getTextLength(String text) {
            int length = 0;
            for (int i = 0; i < text.length(); i++) {
                if (StringUtils.isChinese(text.charAt(i))) {
                    length += 2;
                } else {
                    length += 1;
                }
            }
            return length;
        }
    
    	/**
         * 功能:判断字符是否为数字
         *
         * @param c
         * @return
         */
        public static boolean isNumeric(char c) {
            return  (c >= '0' && c <= '9');
        }
    }
    

    小结

    使用TextWatcher实现对EditText的输入的监控,对输入进行限制和矫正。

  • 相关阅读:
    SVN操作异常
    VS2010安装MVC3
    (转)游戏类型
    (转)32位汇编指令 寄存器
    (转)#pragma 用法
    (转)UI库
    (转)简单实用的网游服务器架构
    (转)一个客户端网游市场分布的数据
    (转)源于魔兽!《植物大战僵尸》成功奥秘
    (转)【分析】中国网游行业上市公司投资分析之网易
  • 原文地址:https://www.cnblogs.com/everhad/p/5543607.html
Copyright © 2020-2023  润新知