转载
字符判断若只判断中文可以考虑用位运算提高处理速度
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
;
}
}
}
相关推荐
setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_LENGTH)}); } ``` 此外,我们还可以重写`onDraw()`方法来自定义绘制过程,比如改变边框颜色、形状或添加下划线: ```java @Override protected ...
例如,可以使用`InputFilter.LengthFilter`来限制输入的最大长度。 4. **格式化显示**:可以使用自定义的SpannableStringBuilder来动态更新验证码的显示,比如在输入完成后,用横线隔开每个数字,增加视觉效果。 5...
setFilters(new InputFilter[]{new InputFilter.LengthFilter(6)}); // ... } @Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { // 更新占位符...
首先,我们要解决的是自定义纯数字键盘的问题。在Android原生系统中,系统键盘通常包含字母、数字和特殊字符等多种键位,但在某些场景下,我们可能只需要用户输入数字,例如设置PIN码或密码。为此,我们可以创建一个...
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10), new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, ...
textView.setFilters(new InputFilter[]{new InputFilter.LengthFilter(6)}); ``` 在这段代码中: - `MyPasswordTransformationMethod` 类继承了 `PasswordTransformationMethod` 并重写了 `getTransformation` ...
通过设置`InputType.TYPE_NUMBER_VARIATION_PASSWORD`,我们可以限制用户只能输入数字,并且使用`InputFilter.LengthFilter`来限制输入的最大长度,通常是6位,即银行卡或支付密码的标准长度。 初始化`...
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` **6. 表单验证** 在表单提交前,通常需要验证所有`EditText`中的数据。可以使用`setError()`方法显示错误信息,提示用户更正: `...
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_PASSWORD_LENGTH)}); ``` 或者定制过滤规则,例如只允许数字和字母: ```java InputFilter filter = new InputFilter() { @Override...
`isValidPhoneNumber()` 是一个自定义函数,用于检查输入字符串是否符合手机号码格式,可以使用正则表达式或者自定义规则实现。例如,中国的手机号码通常为11位数字,可以这样验证: ```java private boolean ...
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` `ClearEditText`不仅提供了美观的交互体验,也简化了开发过程。在实际项目中,我们可以根据需求自定义清除图标的样式、大小和行为...
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` ### 2. 指定输入类型 `EditText`支持多种输入类型,如数字、电话号码、电子邮件等,这通过设置`inputType`属性实现。以下是一些...
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` 这段代码将`EditText`的输入过滤器设置为长度过滤器,限制最多输入10个字符。 以上就是关于`EditText`默认提示颜色和输入变色的...
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` ### 2. 文本监听(TextWatcher) TextWatcher是一个接口,用于监听EditText中文本的变化。它可以监听到添加、删除和替换操作。...
4. **自定义`InputFilter`**:可以创建一个自定义的`InputFilter`,在文本输入时过滤掉超过限制的字符,这样可以防止`EditText`中的字符数超过设定值。 ```java editText.setFilters(new InputFilter[]{new ...
- 如果设置了整数位数限制,设置 `InputFilter.LengthFilter` 来限制总的字符数(整数位数加上小数位数加1,因为小数点也算一个字符)。 - 如果输入的小数部分超过了预设的位数,截取字符串,只保留指定的小数位数,...
源码中还包括了一些优化和插件机制,例如StopWordFilter(停用词过滤)、LengthFilter(长度过滤)、 LowerCaseFilter(小写转换)等,这些都是在分词过程中常用的预处理步骤。此外,IKAnalyzer还支持自定义分词策略...
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); ``` 2. 输入格式验证:可以通过自定义`InputFilter`实现,比如验证邮箱格式: ```java InputFilter emailFilter = new InputFilter()...
最后,将创建的InputFilter应用到EditText上,通过`setFilters`方法,使得EditText的输入行为受到我们自定义的过滤规则约束。 通过这种方式,我们成功地实现了EditText只允许输入最多一位小数的功能。这种方法不仅...