EditText是最常用的控件。很多情况下都要求只能输入特定的字符。比如只能输入整数,只能输入两位小数等。
为了满足EditText输入限制,大体上有两种方法:
- 给EditText加TextWatcher,监听用户输入,如果输入不合法,作相应处理。
- 使用InputFilter。
两种方法都能实现,但感觉第一种方式不太好复用。考虑使用InputFilter的实现。
InputFilters can be attached to Editables to constrain the changes that can be made to them.
(InputFilters可以限制可输入控件的输入)
EditText继承TextView,TextView中有个setFilters方法,这个方法就是设置InputFilters的。需要注意的是,这个方法最好只调用一次,多次调用,只有最后一次才会生效(即会覆盖之前的操作)。
在实际使用中,只要实现InputFilter类,满足各种各样的输入限制就行了。InputFilter只有一个filter方法要实现。该方法有五个参数:
- CharSequence source:刚输入的还没显示出来的字符
- int start与int end:应该是输入字符的位置,输入一个字符时分别是0和1,删除时都是0.
- Spanned dest:已经在EditText中显示出来的字符。
- int dstart, int dend:输入字符要插入和删除的位置。
实现了一个XEditText类,该类继承自AppCompatEditText,实现了多个InputFilter满足输入限制的功能。
import android.content.Context;
import android.support.v7.widget.AppCompatEditText;
import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;
import android.util.AttributeSet;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
* Created by 林下de夕阳 on 2017/4/28.
* 具有输入限制的EditText
*/
public class XEditText extends AppCompatEditText {
// 保存设置的所有输入限制
private List<InputFilter> inputFilters;
public XEditText(Context context) {
super(context);
init();
}
public XEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public XEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
inputFilters = new ArrayList<>();
}
/**
* 设置允许输入的最大字符数
*/
public void setMaxLengthFilter(int maxLength) {
inputFilters.add(new