EditText
replay;
private int
editStart,
editEnd;
private long MAX_COUNT = 200;
private long MAX_COUNT = 200;
@Override
public void beforeTextChanged(CharSequence s,
int start,
int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
editStart = replay.getSelectionStart();
editEnd = replay.getSelectionEnd();
// 先去掉监听,否则会出现栈溢器出
replay.removeTextChangedListener( this);
// 注意这里只能每次都对整个 EditText 的内容求长度,不能对删除的单个字符求长度
// 因为是中英文混合,单个字符而言, calculateLength 函数都会返回 1
while (calculateLength(s.toString()) > MAX_COUNT) { // 当输入字符个数超过限制的大小时,进行截断操作
s.delete( editStart - 1, editEnd);
editStart--;
editEnd--;
}
replay.setText(s);
replay.setSelection( editStart);
// 恢复监听器
replay.addTextChangedListener( this);
tvNum.setText(String. format(getString(R.string. 字数), String. valueOf( 0 + getInputCount())));
}
/**
* 获取用户输入的分享内容字数
*
* @return
*/
private long getInputCount() {
return calculateLength( replay.getText().toString());
}
/**
* 计算图说内容的字数,一个汉字 = 两个英文字符,一个中文标点 = 两个英文标点 注意:该函数的不是用于对单个字符进行计算,因为单个字符四舍五入后都是 1
*
* @param c
* @return
*/
private long calculateLength(CharSequence c) {
double len = 0;
for ( int i = 0; i < c.length(); i++) {
int tmp = ( int) c.charAt(i);
if (tmp > 0 && tmp < 127) {
len += 0.5;
} else {
len++;
}
}
return Math. round(len);
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
editStart = replay.getSelectionStart();
editEnd = replay.getSelectionEnd();
// 先去掉监听,否则会出现栈溢器出
replay.removeTextChangedListener( this);
// 注意这里只能每次都对整个 EditText 的内容求长度,不能对删除的单个字符求长度
// 因为是中英文混合,单个字符而言, calculateLength 函数都会返回 1
while (calculateLength(s.toString()) > MAX_COUNT) { // 当输入字符个数超过限制的大小时,进行截断操作
s.delete( editStart - 1, editEnd);
editStart--;
editEnd--;
}
replay.setText(s);
replay.setSelection( editStart);
// 恢复监听器
replay.addTextChangedListener( this);
tvNum.setText(String. format(getString(R.string. 字数), String. valueOf( 0 + getInputCount())));
}
/**
* 获取用户输入的分享内容字数
*
* @return
*/
private long getInputCount() {
return calculateLength( replay.getText().toString());
}
/**
* 计算图说内容的字数,一个汉字 = 两个英文字符,一个中文标点 = 两个英文标点 注意:该函数的不是用于对单个字符进行计算,因为单个字符四舍五入后都是 1
*
* @param c
* @return
*/
private long calculateLength(CharSequence c) {
double len = 0;
for ( int i = 0; i < c.length(); i++) {
int tmp = ( int) c.charAt(i);
if (tmp > 0 && tmp < 127) {
len += 0.5;
} else {
len++;
}
}
return Math. round(len);
}