【Android】EditText 1文字目の入力文字に応じて異なる最大入力長を設定
5786 ワード
1、はじめに
入力ボックスの最初の文字が「8」であればEditTextの最大入力長を13、入力ボックスの最初の2文字が「08」であればEditTextの最大入力長を14とする必要がある.
2、考え方
入力ボックスの入力文字を傍受し、入力文字に基づいて最大入力長を設定すると判断します.
3、上コード
3.1入力ボックス入力傍受インタフェースの実現
コンストラクション関数がEditTextに転送され、filterの取得と設定が容易になります.
フィルタを追加:
まずEditTextから既存のfileter[]を取得し、長さが0の場合、まだfilterが設定されていないことを示します.この場合、私たちのfilterを直接設定すればいいです.
配列が空でない場合は、配列内に長さ制限のあるLengthFilterがあるかどうかを判断し、私たちのfilterを直接追加しなければ、
もしあれば、私たちのfilterを直接割り当てて、過去のfilter[]をEditableに更新すればいいです.
3.2使用
使用する場合、newのオブジェクトを直接EditTextの傍受方法に入れます.
注意:親のonTextChanged()メソッドを呼び出すと、親の設定が最大長で有効になります.
入力ボックスの最初の文字が「8」であればEditTextの最大入力長を13、入力ボックスの最初の2文字が「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);
//
}