【Android】EditText 1文字目の入力文字に応じて異なる最大入力長を設定

5786 ワード

1、はじめに
入力ボックスの最初の文字が「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);
                //       
            }