在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”的用法
可能有些小夥伴看到這裏會說,這裏有什麼需要注意的嗎?
- 在寫登錄界面的代碼的時候,當編輯框長度發生變化時候,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則換成灰色的,嘿嘿>_<