EditText范围内的值

时间:2011-03-22 12:42:43

标签: android

我想在1-60范围内输入值。 EditText不应接受61,62 ...或0,-1,-2 ......

等值

我们怎么能在android中给出范围1-60到EditText? 我在main.xml中完成了

 <EditText android:layout_height="wrap_content" 
    android:id="@+id/editText1" 
    android:layout_width="160dip" 
    android:inputType="number">
    </EditText>

8 个答案:

答案 0 :(得分:17)

您可以为TextWatcher分配EditText并在那里收听文字更改,例如:

public void afterTextChanged(Editable s) {
   try {
     int val = Integer.parseInt(s.toString());
     if(val > 60) {
        s.replace(0, s.length(), "60", 0, 2);
     } else if(val < 1) {
        s.replace(0, s.length(), "1", 0, 1);
     }
   } catch (NumberFormatException ex) {
      // Do something
   }
}

如Devunwired所述,请注意,对s.replace()的调用将再次递归调用TextWatcher。

通常通过检查布尔“编辑”标志来包装这些更改,以便递归调用跳过并简单地返回来自内部的更改。

答案 1 :(得分:5)

我遇到了一个简洁的解决方案here

public class InputFilterMinMax implements InputFilter {

private int min, max;

public InputFilterMinMax(int min, int max) {
    this.min = min;
    this.max = max;
}

public InputFilterMinMax(String min, String max) {
    this.min = Integer.parseInt(min);
    this.max = Integer.parseInt(max);
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        int input = Integer.parseInt(dest.toString() + source.toString());
        if (isInRange(min, max, input))
            return null;
    } catch (NumberFormatException nfe) { }
    return "";
}

private boolean isInRange(int a, int b, int c) {
    return b > a ? c >= a && c <= b : c >= b && c <= a;
}
}

只需将此过滤器应用于编辑文本,如下所示:

mCentsEditText = (EditText)v.findViewById(R.id.cents_edit_text);
InputFilterMinMax filter = new InputFilterMinMax("0", "99") {};
mCentsEditText.setFilters(new InputFilter[]{filter});

答案 2 :(得分:2)

为什么不使用Seekbar而不是EditText? 这样,只能输入数字,并且可以根据需要指定/修改最大限制。

public class SeekBar1 extends Activity implements SeekBar.OnSeekBarChangeListener {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   ..
   mSeekBar = (SeekBar)findViewById(R.id.seekBar);
   mSeekBar.setOnSeekBarChangeListener(this);
   ..
 }
 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
   //Do your Changes Here
 }
 public void onStartTrackingTouch(SeekBar seekBar) {
    //On First Track Touch
 }
 public void onStopTrackingTouch(SeekBar seekBar) {
    //On Stop Track Touch
 }
}

对于数字输入类型值,Seekbar是最好的UI。虽然,它的精确度值得怀疑。

答案 3 :(得分:1)

试试这个..

   EditText.setOnEditorActionListener(new OnEditorActionListener()
    {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
    //add your condtion here.
    return false;
}   
});

答案 4 :(得分:1)

非常有趣的问题。

我想最好的方法是实现一个新的inputType,但setInputType方法接收一个int。什么都没做:(

在该方法文档中,它说:

  

使用a设置内容的类型   为inputType定义的常量。   这将照顾改变   关键监听,通过调用   setKeyListener(KeyListener),匹配   给定的内容类型。

很好,您可以提供keyListener setKeyListener

您可以扩展android.text.method.DigitsKeyListener以创建新的keyListener,从而避免TextWatcher的问题。

答案 5 :(得分:1)

我没有足够的权利来评论Ashok Felix的答案,但我想补充一点,我发现有些代码不愿意在偏好中显示SeekBar。

这很容易使用(我不是作者)。请参阅Matthew Wiggins的SeekBarPreference代码:http://android.hlidskialf.com/blog/code/android-seekbar-preference

答案 6 :(得分:1)

这可行,但不能直播。

editText.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                try {
                    int val = Integer.parseInt(editText.getText()
                            .toString());
                    if (val > 2000) {
                        editText.setText("");
                    } else if (val < 100) {
                        editText.setText("");
                    }
                } catch (NumberFormatException ex) {
                }
            }
        });

答案 7 :(得分:1)

我修复了 Daniel Wilson 的解决方案:

public class InputFilterMinMax implements InputFilter {

private int min, max;

public InputFilterMinMax(int min, int max) {
    this.min = min;
    this.max = max;
}

public InputFilterMinMax(String min, String max) {
    this.min = Integer.parseInt(min);
    this.max = Integer.parseInt(max);
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        //The commented line below only works if you append/modify the end of the text (not the beginning or middle)
        //int input = Integer.parseInt(dest.toString() + source.toString());
        //corrected solution below (3lines)
        CharSequence part1 = dest.subSequence(0, dstart);
        CharSequence part2 = dest.subSequence(dend, dest.length());
        int input = Integer.parseInt(part1 + source.toString() + part2);

        if (isInRange(min, max, input))
            return null;
    } catch (NumberFormatException nfe) { }
    return "";
}

private boolean isInRange(int a, int b, int c) {
    return b > a ? c >= a && c <= b : c >= b && c <= a;
}
}

最后将 InputFilter 添加到您的 EditText 控件中:

mCentsEditText = (EditText)findViewById(R.id.cents_edit_text);
InputFilterMinMax filter = new InputFilterMinMax("1", "60") {};
mCentsEditText.setFilters(new InputFilter[]{filter});