關於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則換成灰色的,嘿嘿>_<

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章