Android 在addTextChangedListener上更改EditText文本的更好方法

Android 在addTextChangedListener上更改EditText文本的更好方法,android,android-edittext,Android,Android Edittext,我想做的是限制可以插入到EditText中的值的范围,比如NumberPicker。为什么我不用NumberPicker?因为它需要API 11,我希望我的应用程序与API 10及以上兼容。 我已将范围设置为1到120。如果用户输入的数字超出该范围,EditText中的文本将更改为15 我有这个代码,但我认为这不是最好的方式来实现这一点 final EditText ed = ((EditText) findViewById(R.id.editMinutes)); TextWatcher tw

我想做的是限制可以插入到EditText中的值的范围,比如NumberPicker。为什么我不用NumberPicker?因为它需要API 11,我希望我的应用程序与API 10及以上兼容。 我已将范围设置为1到120。如果用户输入的数字超出该范围,EditText中的文本将更改为15

我有这个代码,但我认为这不是最好的方式来实现这一点

final EditText ed = ((EditText) findViewById(R.id.editMinutes));
TextWatcher tw = new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

    @Override
    public void afterTextChanged(Editable s) {
        }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        try {
            int minutes = Integer.valueOf(s.toString());
            if (minutes < 1 || minutes > 120) {
                ed.setText("15");
            }
        } catch (NumberFormatException ex) {
            ed.setText("15");
        }
    }
};
ed.addTextChangedListener(tw);
final EditText ed=((EditText)findViewById(R.id.editMinutes));
TextWatcher tw=新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
公共无效后文本已更改(可编辑){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
试一试{
int minutes=Integer.valueOf(s.toString());
如果(分钟<1 | |分钟>120){
ed.setText(“15”);
}
}捕获(NumberFormatException ex){
ed.setText(“15”);
}
}
};
ed.addTextChangedListener(tw);

我该如何改进这一点?有更好或更优雅的方法吗?

您可以使用输入筛选器定义正则表达式

    InputFilter filter= new InputFilter() {
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

                String checkMe = dest.toString()+ source.toString();
                Pattern pattern = Pattern.compile("([1-9][0-9]?|1[01][0-9]|120)");
                Matcher matcher = pattern.matcher(checkMe);
                boolean valid = matcher.matches();
                if(!valid){
                    Log.i("", "invalid");
                    return "";
                }else{
                    Log.i("", "valid less than 120");
                }
            return null;

        }
    };

    EditText editText=(EditText)findViewById(R.id.editMinutes);
    editText.setFilters(new InputFilter[]{filter});
更优雅的文本观察程序代码取自

像这样使用它:

 editText.addTextChangedListener(new TextValidator(editText) {
  @Override public void validate(TextView textView, String text) {
   /* Validation code here */
   }
});

如果你真的想要一个数字选择器-进入AOSP源代码,找到数字选择器,并将其添加到你的应用程序中,然后使用它。数字选择器不需要硬件支持,它只是一个GUI组件。第二,我在看代码,这很简单,我不认为我可以使用外部代码。至少不是那么大。
 editText.addTextChangedListener(new TextValidator(editText) {
  @Override public void validate(TextView textView, String text) {
   /* Validation code here */
   }
});