关于Android中EditText 常见问题小总结

在android开发中,编辑框EditText是最常用到的组件之一。
在很多场合中,我们都会使用到它。现在对其进行总结一二。

1、对edittext输入的字符长度进行限制,要求输入N个字符。这时的解决办法通常有以下几种思路

在Xml布局中设置 android:ems=”N”,这里必须注意的是 android:layout_width=”wrap_content”必须为wrap_content,否则不起作用

<EditText
                android:id="@+id/password_et"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="11"
                android:drawableLeft="@mipmap/password"
                android:singleLine="true"
                android:hint="@string/password_hint"
                android:inputType="numberPassword"
             />

在XML布局中设置 android:maxLength=”…”

 <EditText
                android:id="@+id/password_et"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@mipmap/password"
                android:singleLine="true"
                android:maxLength="20"
                android:hint="@string/password_hint"
                android:inputType="numberPassword"
              />

或者在java代码中设置

InputFilter[] filters = { new InputFilter.LengthFilter(11) };
mEditText.setFilters(filters);

上面的写法只能控制字符长度,假如在 要使用在 中英文混合 ,表情等环境下,由于每个 对象单元对应大小不一样,则用上面的方法不能控制编辑框内容的长度。 解决办法—> Class A extends InputFilter{}

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;
        }
    }

}

2、编辑框的android:drawableLeft=”@mipmap/password”的用法
可能有些小伙伴看到这里会说,这里有什么需要注意的吗?

  1. 在写登录界面的代码的时候,当编辑框长度发生变化时候,android:drawableLeft图片改变
    通常我们的做法可以如下
 password_et.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }


            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                MLog.i(null,s.length()+"");
                if (s.length()>0){
                    Drawable drawable=getResources().getDrawable(R.mipmap.password_1);
               drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
                    password_et.setCompoundDrawables(drawable,null,null,null);
                    if (!TextUtils.isEmpty(name_et)){
                        pswd_et=password_et.getText().toString();
                        login_btn.setEnabled(true);
                    }
                }else{
                    Drawable drawable=getResources().getDrawable(R.mipmap.password);
                    drawable.setBounds(0,0,drawable.getMinimumWidth(),drawable.getMinimumHeight());
                    password_et.setCompoundDrawables(drawable,null,null,null);
                }

            }

            @Override
            public void afterTextChanged(Editable s) {


            }
        });

在这里有个不好的地方,就是在编辑框没发生变化的时候,我们都会对 图片进行改变。虽然是个局部变量 很快就会回收,但是仍然耗CPU(可以忽略不计),我们可以在其中在外面对其进行标志,也可以用个简单的方法, s.length()>0,换成 s.length()==1就换成亮色的,s.length()==0则换成灰色的,嘿嘿>_<

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值