您的位置:首页 > 产品设计 > UI/UE

AndroidUI——InputFilter的使用(3)

2016-05-24 18:38 387 查看
在项目中经常会遇到限制EditText输入长度的需求,这个很好解决,设置maxLength属性就行了;但是偶尔会遇到限制长度的升级版:中文算两个字符。比如说这个输入框最多可以输入16个英文字符或8个中文,如果中英文混合输入,那么中文数*2+英文数要小于等于16。

布局文件内容不变

LengthFilter.java

package com.wind.demo;

import android.text.InputFilter;
import android.text.Spanned;

public class LengthFilter implements InputFilter {
private static final int ASCII = 1; //英文字符长度
private static final int OTHER = 2; //其他字符长度

private final int mMaxLength; //可输入的最大长度

public LengthFilter(int maxLength) {
mMaxLength = maxLength;
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
int keep = mMaxLength - countStringLength(dest); //计算剩余可输入的长度
if(keep <= 0) { //剩余可输入的长度不大于0,返回空字符
return "";
} else if(keep >= countStringLength(source)) { //剩余可输入的长度大于输入字符串的长度,不做过滤处理,使用原来的输入字符串
return null;
} else { //输入字符串的长度大于剩余可输入的长度
int index = countCutIndex(keep, source); //计算截断输入字符串的位置
return source.subSequence(0, index); //返回截断后的字符串
}
}

/**
* 计算输入字符串的截断位置
* */
private int countCutIndex(int keep, CharSequence source) {
int length = 0;
for(int i = 0; i < source.length(); i++) {
char c = source.charAt(i);
length += countCharLength(c);
if(length > keep) {
return i;
}
}
return source.length() - 1;
}

/**
* 计算字符串的长度
* */
private int countStringLength(CharSequence str) {
if(str == null) {
return 0;
}

int length = 0;
for(int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
length += countCharLength(c);
}
return length;
}

/**
* 计算字符的长度
* */
private int countCharLength(char c) {
if(33 <= c && c <= 126) { //英文字符值的范围
return ASCII;
} else {
return OTHER;
}
}
}


MainActivity.java

package com.wind.demo;

import android.app.Activity;
import android.os.Bundle;
import android.text.InputFilter;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

EditText editText = (EditText) findViewById(R.id.edittext);
editText.setFilters(new InputFilter[]{new LengthFilter(16)});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: