1. 程式人生 > >Android EditView 輸入限制(軟鍵盤限制)

Android EditView 輸入限制(軟鍵盤限制)

眾所周知EditView有個inputType 屬性可以設定輸入的型別。
如下設定,則只能輸入數字:

android:inputType="number"

但是有時候需要自定義輸入限制條件,比如第一位只能是“1”,一共11位,超過11位則無法輸入,或者只允許輸入小於5以下的數字等,則需要其他設定。Android中有三種方式來設定。

第一種:digits 屬性

如下設定為:只能輸入0-5之間的數字,且最多11位。

 <EditText
        android:id="@+id/etDigits"
        android:layout_width
="match_parent" android:layout_height="wrap_content" android:digits="012345" android:hint="通過digits設定" android:inputType="number" android:maxLength="11" />

PS:優點:簡單方便;
缺點:只能設定簡單的限制,如果需要設定的比較複雜,如數字字母和某些特定字元則需要在digits中窮舉出來。

第二種:TextWatcher設定

此方式也比較靈活,不錯的方式。

EditText etTextWatcher = (EditText) findViewById(R.id.etTextWatcher);
etTextWatcher.addTextChangedListener(new EditTextWatcher(etTextWatcher));
/**
 * Created by xugang on 2016/6/23.
 * 輸入監聽
 */
public class EditTextWatcher implements TextWatcher {
    private EditText editText;
    public EditTextWatcher
(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) { if (s != null && s.length() > start) { //輸入判斷規則 if (!RegularUtils.compare(s.toString().trim(), RegularUtils.LIMIT_PHONE_INPUT)) { editText.setText(s.subSequence(0, s.length() - 1)); editText.setSelection(s.length() - 1); } } } @Override public void afterTextChanged(Editable s) { } }

第三種:設定Filters,通過正則進行限制

傳入正則規則即可,靈活性比較高。

public static final String LIMIT_PHONE_INPUT = "^1\\d{0,10}$";//限制只允許輸入首位為1的最多11位的數字
EditView etInputFilter = (EditView)findViewById(R.id.etInputFilter);
etInputFilter.setFilters(new EditInputFilter(LIMIT_PHONE_INPUT));
/**
 * Created by xugang on 2016/6/22.
 * EditView過濾器
 */
public class EditInputFilter implements InputFilter {
    //
    private String regular;
    public EditInputFilter(String regular) {
        this.regular = regular;
    }
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        if (regular == null)
            return source;
        if (dstart == 0 && dend == 0 && TextUtils.isEmpty(source))
            return null;
        if (dstart == dend) {
            //輸入
            StringBuilder builder = new StringBuilder(dest);
            if (builder.append(source).toString().matches(regular)) return source;
            else return "";
        }
        return source;
    }
}