`
wangzt_2008
  • 浏览: 46639 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义LengthFilter

阅读更多

转载

 

字符判断若只判断中文可以考虑用位运算提高处理速度

public class CustomLengthFilter extends LengthFilter {
    private int max;// 字符串能输入的最大长度
    private onFullListener listener;
 
    /**
     * @param max
     *            字符串能输入的最大长度,半角字符算1,全角字符算2
     */
    public CustomLengthFilter(final int max) {
        super(max);
        this.max = max;
    }
 
    @Override
    public CharSequence filter(CharSequence source, int start, int end,
            Spanned dest, int dstart, int dend) {
// 修改字符串的长度
        int mlength = getLength(dest.subSequence(dstart, dend).toString());
// 已有字符串的长度
        int dlength = getLength(dest.toString());
// 要增加的字符串的长度
        int slength = getLength(source.subSequence(start, end).toString());
// 还差多少字符到最大长度
        int keep = this.max - (dlength - mlength);
        if (keep <= 0) {
            // 已经到达最大长度
            if (null != listener) {
                listener.isFull();
            }
            return "";
        } else if (keep >= slength) {
            // 还没到达最大长度
            return null;
        } else {
            // 超出最大长度
            int tmp = 0;
            int index;
            for (index = start; index <= end; index++) {
                if (isFullwidthCharacter(source.charAt(index))) {
                    tmp += 2;
                } else {
                    tmp += 1;
                }
                if (tmp > keep) {
                    break;
                }
            }
            if (null != listener) {
                listener.isFull();
            }
            return source.subSequence(start, index);
        }
    }
 
    public void setOnFullListener(onFullListener listener) {
        this.listener = listener;
    }
 
    public interface onFullListener {
 
        /**
         * 这个方法会在输入字符串超出极限时被调用
         */
        void isFull();
    }
 
    /**
     * 判断字符串是否为空或空串
     *
     * @param str
     *            待判断的字符串
     * @return true:字符串为空或空串
     */
    public static boolean isNull(final String str) {
        if (null == str || "".equals(str)) {
            return true;
        } else {
            return false;
        }
    }
 
    /**
     * 获取字符串长度(半角算1、全角算2)
     *
     * @param str
     *            字符串
     * @return 字符串长度
     */
    public static int getLength(final String str) {
        if (isNull(str)) {
            return 0;
        }
        int len = str.length();
        for (int i = 0; i < str.length(); i++) {
            if (isFullwidthCharacter(str.charAt(i))) {
                len = len + 1;
            }
        }
        return len;
    }
 
    /**
     * 获取字符串的全角字符数
     *
     * @param str
     *            待计算的字符串
     * @return 字符串的全角字符数
     */
    public static int getFwCharNum(final String str) {
        if (isNull(str)) {
            return 0;
        }
        int num = 0;
        for (int i = 0; i < str.length(); i++) {
            if (isFullwidthCharacter(str.charAt(i))) {
                num++;
            }
        }
        return num;
    }
 
    /**
     * 判断字符是否为全角字符
     *
     * @param ch
     *            待判断的字符
     * @return true:全角; false:半角
     */
    public static boolean isFullwidthCharacter(final char ch) {
        if (ch >= 32 && ch <= 127) {
            // 基本拉丁字母(即键盘上可见的,空格、数字、字母、符号)
            return false;
        } else if (ch >= 65377 && ch <= 65439) {
            // 日文半角片假名和符号
            return false;
        } else {
            return true;
        }
    }
 
}
分享到:
评论

相关推荐

    android 自定义Editext

    setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_LENGTH)}); } ``` 此外,我们还可以重写`onDraw()`方法来自定义绘制过程,比如改变边框颜色、形状或添加下划线: ```java @Override protected ...

    android 验证码自定义view

    例如,可以使用`InputFilter.LengthFilter`来限制输入的最大长度。 4. **格式化显示**:可以使用自定义的SpannableStringBuilder来动态更新验证码的显示,比如在输入完成后,用横线隔开每个数字,增加视觉效果。 5...

    自定义EditText密码框

    setFilters(new InputFilter[]{new InputFilter.LengthFilter(6)}); // ... } @Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { // 更新占位符...

    自定义纯数字键盘 + 只能输入6位数字密码输入框2个demo

    首先,我们要解决的是自定义纯数字键盘的问题。在Android原生系统中,系统键盘通常包含字母、数字和特殊字符等多种键位,但在某些场景下,我们可能只需要用户输入数字,例如设置PIN码或密码。为此,我们可以创建一个...

    EdtiText自定义样式

    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10), new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, ...

    android之密码输入框更改默认黑点图标为星号图标

    textView.setFilters(new InputFilter[]{new InputFilter.LengthFilter(6)}); ``` 在这段代码中: - `MyPasswordTransformationMethod` 类继承了 `PasswordTransformationMethod` 并重写了 `getTransformation` ...

    Android 钱包支付之输入支付密码的实现步骤

    通过设置`InputType.TYPE_NUMBER_VARIATION_PASSWORD`,我们可以限制用户只能输入数字,并且使用`InputFilter.LengthFilter`来限制输入的最大长度,通常是6位,即银行卡或支付密码的标准长度。 初始化`...

    安卓Android源码——(EditText文本编辑).rar

    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` **6. 表单验证** 在表单提交前,通常需要验证所有`EditText`中的数据。可以使用`setError()`方法显示错误信息,提示用户更正: `...

    TestEditText

    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_PASSWORD_LENGTH)}); ``` 或者定制过滤规则,例如只允许数字和字母: ```java InputFilter filter = new InputFilter() { @Override...

    Android Form EditText 验证输入合法性的编辑框.zip源码资源下载

    `isValidPhoneNumber()` 是一个自定义函数,用于检查输入字符串是否符合手机号码格式,可以使用正则表达式或者自定义规则实现。例如,中国的手机号码通常为11位数字,可以这样验证: ```java private boolean ...

    android ClearEditText demo

    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` `ClearEditText`不仅提供了美观的交互体验,也简化了开发过程。在实际项目中,我们可以根据需求自定义清除图标的样式、大小和行为...

    EditText_test

    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` ### 2. 指定输入类型 `EditText`支持多种输入类型,如数字、电话号码、电子邮件等,这通过设置`inputType`属性实现。以下是一些...

    EditText默认提示颜色和输入变色

    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` 这段代码将`EditText`的输入过滤器设置为长度过滤器,限制最多输入10个字符。 以上就是关于`EditText`默认提示颜色和输入变色的...

    Android EditText筛选+选择功能开发

    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` ### 2. 文本监听(TextWatcher) TextWatcher是一个接口,用于监听EditText中文本的变化。它可以监听到添加、删除和替换操作。...

    安卓EditText输入框相关-EditText字数检测与限制的冲突文件2016-11-1517-03-23-811.rar

    4. **自定义`InputFilter`**:可以创建一个自定义的`InputFilter`,在文本输入时过滤掉超过限制的字符,这样可以防止`EditText`中的字符数超过设定值。 ```java editText.setFilters(new InputFilter[]{new ...

    Android EditText限制输入整数和小数的位数的方法示例

    - 如果设置了整数位数限制,设置 `InputFilter.LengthFilter` 来限制总的字符数(整数位数加上小数位数加1,因为小数点也算一个字符)。 - 如果输入的小数部分超过了预设的位数,截取字符串,只保留指定的小数位数,...

    java源码:中文分词库 IKAnalyzer.zip

    源码中还包括了一些优化和插件机制,例如StopWordFilter(停用词过滤)、LengthFilter(长度过滤)、 LowerCaseFilter(小写转换)等,这些都是在分词过程中常用的预处理步骤。此外,IKAnalyzer还支持自定义分词策略...

    AndroidEditText限制及手势识别

    editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` 2. 输入格式验证:可以通过自定义`InputFilter`实现,比如验证邮箱格式: ```java InputFilter emailFilter = new InputFilter()...

    EditText限制输入数字,精确到小数点后1位的设置方法

    最后,将创建的InputFilter应用到EditText上,通过`setFilters`方法,使得EditText的输入行为受到我们自定义的过滤规则约束。 通过这种方式,我们成功地实现了EditText只允许输入最多一位小数的功能。这种方法不仅...

Global site tag (gtag.js) - Google Analytics