在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则换成灰色的,嘿嘿>_<