1、前言
有这样一个需求,如果输入框第一个字符为“8”则设置EditText的最大输入长度为13,如果输入框前两个字符为“08”则设置EditText的最大输入长度为14。
2、思路
监听输入框的输入文字,根据输入文字来判断设置最大输入长度。
3、上代码
3.1 实现输入框输入监听接口
/**
*
* 处理手机输入框 的长度限制
* 1、8开头的输入框限制输入13位
* 2、08以及其他开头的输入框限制输入14位
*/
public class PhoneTextWatcher implements TextWatcher {
/**
* 限制登录账号08开头最大长度14
*/
public static final int PHONE_FOURTEEN_LENGTH = 14;
/**
* 限制登录账号8开头最大长度13
*/
public static final int PHONE_THIRTEEN_LENGTH = 13;
/**
* 以8开头
*/
private static final String START_8 = "8";
/**
* 是否需要更新filter
* 每次清空EditText上的文字之后,该标记置为true
* 防止每次修改一个字符就需要设置filter一次
*/
private boolean changeFilter = true;
private InputFilter.LengthFilter phoneThirteenFilter = null;
private InputFilter.LengthFilter phoneFourteenFilter = null;
private EditText editText;
public PhoneTextWatcher(EditText editText) {
this.editText = editText;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String account = editText.getText().toString();
if (!TextUtils.isEmpty(account) && changeFilter) {
if (account.startsWith(START_8)) {
addFilter(getThirteenFilter());
} else {
addFilter(getFourteenFilter());
}
changeFilter = false;
}else if (TextUtils.isEmpty(account)){
changeFilter = true;
}
}
@Override
public void afterTextChanged(Editable s) {
}
/**
* 添加过滤
* @param filter
*/
private void addFilter(InputFilter.LengthFilter filter) {
//获取EditText已有的filters[]
InputFilter[] filters = editText.getFilters();
//如果EditText没有filters[] 直接为EditText设置filter
if (filters == null || filters.length == 0){
editText.setFilters(new InputFilter[]{filter});
return;
}
//如果EditText有LengthFilter类型的filter 直接替换为我们自己的filter
boolean hasLengthFilter = false;
for (int i = 0; i < filters.length; i++) {
if (filters[i] instanceof InputFilter.LengthFilter){
hasLengthFilter = true;
filters[i] = filter;
continue;
}
}
//替换为我们自己的filter成功,需要给Editable 设置修改之后的filter[]
//如果EditText没有LengthFilter类型的filter ,直接给EditText设置filter
if (hasLengthFilter){
editText.setFilters(filters);
}else{
editText.setFilters(new InputFilter[]{filter});
}
}
/**
* 获取长度为13的filter
* @return
*/
private InputFilter.LengthFilter getThirteenFilter(){
if (phoneThirteenFilter == null) {
phoneThirteenFilter = new InputFilter.LengthFilter(PHONE_THIRTEEN_LENGTH);
}
return phoneThirteenFilter;
}
/**
* 获取长度为14的filter
* @return
*/
private InputFilter.LengthFilter getFourteenFilter(){
if (phoneFourteenFilter == null) {
phoneFourteenFilter = new InputFilter.LengthFilter(PHONE_FOURTEEN_LENGTH);
}
return phoneFourteenFilter;
}
}
构造函数传入EditText,方便获取和设置filter
private EditText editText;
public PhoneTextWatcher(EditText editText) {
this.editText = editText;
}
添加过滤器:
首先从EditText获取已有的fileter[ ] ,如果长度为0说明还没有设置过任何的filter,此时直接设置我们的filter即可。
如果数组不为空,则判断数组内是否已经有限制长度的LengthFilter ,如果没有直接添加我们的filter即可,
如果有则直接把我们的filter赋值过去,然后更新一下修改过去的filter[]到Editable即可。
/**
* 添加过滤
* @param filter
*/
private void addFilter(InputFilter.LengthFilter filter) {
//获取EditText已有的filters[]
InputFilter[] filters = editText.getFilters();
//如果EditText没有filters[] 直接为EditText设置filter
if (filters == null || filters.length == 0){
editText.setFilters(new InputFilter[]{filter});
return;
}
//如果EditText有LengthFilter类型的filter 直接替换为我们自己的filter
boolean hasLengthFilter = false;
for (int i = 0; i < filters.length; i++) {
if (filters[i] instanceof InputFilter.LengthFilter){
hasLengthFilter = true;
filters[i] = filter;
continue;
}
}
//替换为我们自己的filter成功,需要给Editable 设置修改之后的filter[]
//如果EditText没有LengthFilter类型的filter ,直接给EditText设置filter
if (hasLengthFilter){
editText.getText().setFilters(filters);
}else{
editText.setFilters(new InputFilter[]{filter});
}
}
3.2 使用
phoneEditText.addTextChangedListener(new PhoneTextWatcher(phoneEditText) {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//父类根据输入内容处理输入框的长度
super.onTextChanged(s, start, before, count);
//其他自己的逻辑
}
@Override
public void afterTextChanged(Editable s) {
}
});
使用时,直接把new一个对象放入EditText的监听方法中。
注意:调用父类的onTextChanged()方法,这样父类的设置最大长度才能生效。
public void onTextChanged(CharSequence s, int start, int before, int count) {
//父类根据输入内容处理输入框的长度
super.onTextChanged(s, start, before, count);
//其他自己的逻辑
}