Android EditView 輸入限制(軟鍵盤限制)
阿新 • • 發佈:2018-11-21
眾所周知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;
}
}