Android工具箱中的TextFields中,EditText的inputType定义的N种类型,包括了常用的text,number..
下面代码添加一个number类型的EditText并设置它的数字输入范围示范。
设置输入数字范围的代码:
如果使用屏蔽的代码,就会出现下面问题:
Cannot refer to a non-final variable et inside an inner class defined in a different method
原因见文章:
http://www.2cto.com/kf/201306/223568.html
主要原因是:
在方法中定义的变量时局部变量,当方法返回时,局部变量(str1,str2)对应的栈就被回收了,当方法内部类去访问局部变量时就会发生错误。当在变量前加上final时,变量就不在是真的变量了,成了常量,这样在编译器进行编译时(即编译阶段)就会用变量的值来代替变量,这样就不会出现变量清除后,再访问变量的错误。
下面贴出限定的全部代码:
- private int MIN_MARK = 0;
- private int MAX_MARK = 100;
- //private void setRegion(EditText et)
- private void setRegion( final EditText et)
- {
- et.addTextChangedListener(new TextWatcher() {
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- if (start > 1)
- {
- if (MIN_MARK != -1 && MAX_MARK != -1)
- {
- int num = Integer.parseInt(s.toString());
- if (num > MAX_MARK)
- {
- s = String.valueOf(MAX_MARK);
- et.setText(s);
- }
- else if(num MIN_MARK)
- s = String.valueOf(MIN_MARK);
- return;
- }
- }
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
- }
-
- @Override
- public void afterTextChanged(Editable s)
- {
- if (s != null && !s.equals(""))
- {
- if (MIN_MARK != -1 && MAX_MARK != -1)
- {
- int markVal = 0;
- try
- {
- markVal = Integer.parseInt(s.toString());
- }
- catch (NumberFormatException e)
- {
- markVal = 0;
- }
- if (markVal > MAX_MARK)
- {
- Toast.makeText(getBaseContext(), "分数不能超过100", Toast.LENGTH_SHORT).show();
- et.setText(String.valueOf(MAX_MARK));
- }
- return;
- }
- }
- }
- });
- }
参考文献: