转载请注明出处,谢谢~~
昨天我在网上查看一些关于EditText的控制输入字符的问题。总结了一下有这么几种:
1.通过监听器TextWatcher监听字符数,然后通过弹出窗口阻断输入。
2.通过给EditText设置InputFilter.LengthFilter,来实现最大输入字符,阻断输入。
3.通过TextWather实现控制最大输入。
然后我看了看他们的实现,然后的然后,我放弃了。我不喜欢这种方式,并不是这种方式不可以。因为他们或有限制,或代码麻烦,我崇尚自由(我在装X,发现了没,哈哈)。
(以上言论都是在奠定一个安静的装X的气氛,忽略忽略~~)
然后我复写了一个EditText,打印了它所有的方法(这个可以自己试下,注意复写EditText,不要复写TextView。),发现了一个奇怪但是令人振奋的现象:getText()一直在被调用。(后来想想也是应该的)
我们输入的过程中,是这样的:
图中5是我输入一串汉字。OK,那一切就明了了!
public class ControlNumEditText extends EditText {
private int MAX_NUM = 120;
public interface onTextEditListener{
public void textChanged(int cur_num);
};
private onTextEditListener listener;
public void setOnTextEditListener(onTextEditListener listener) {
this.listener = listener;
}
public ControlNumEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ControlNumEditText(Context context) {
super(context);
}
public int getMaxNum() {
return MAX_NUM;
}
public void setMaxNum(int num) {
this.MAX_NUM = num;
}
@Override
public Editable getText() {
Editable text = super.getText();
int cur_num = (int) calculateLength(text);
if (cur_num > MAX_NUM) {
text.delete(MAX_NUM+1,cur_num);//限制输入 Text limits.
cur_num = MAX_NUM;//返回最大值 Tell the listener current number.
}
if (listener != null) {
listener.textChanged(cur_num);
}
return super.getText();
}
@Override
public void setText(CharSequence text, BufferType type) {
super.setText(text, type);
}
/**
* 判断字符数
* Get the char number.
* @param text
* @return
*/
private long calculateLength(CharSequence text) {
double len = 0;
for (int i = 0; i < text.length(); i++) {
int tmp = (int) text.charAt(i);
if (tmp > 0 && tmp < 127) {
len += 0.5;
} else {
len++;
}
}
return Math.round(len);
}
}
这是控件的所有代码,set/get方法可以设置最大字符MAX_NUM。listener可以实现对已输入字符的回调,回调给你需要显示的Activity。
getText方法内,我们通过super.getText()可以得到这个输入的字符串,然后通过calculateLength()方法来计算字符个数,这里是把字母和数字都当做半个字符对待,实现方式是通过判断ASCII,我前边写过一个工具类,如何判断当前字符组成,那里边就用到了这一种方式。
判断之后我们将多余的字符干掉,然后把MAX_NUM赋给当前字符,然后调用listener的方法返回给回调,这样就保证了回调的正确性。然后再将回调的值赋给TextView用来显示。一切就ok了。
多说一句,多行的EditText默认是从中间开始输入的,想从左上角输入,在XML文件中把EditText的gravity设置为top就行。
时间: 2024-10-07 09:45:11