EditText范围内的值
我想输入1-60范围内的值。 EditText
不应该接受像61,62 ...,或0,-1,-2 ...EditText范围内的值
如何才能给范围1-60到EditText
在Android? 我main.xml中已经做了作为
<EditText android:layout_height="wrap_content"
android:id="@+id/editText1"
android:layout_width="160dip"
android:inputType="number">
</EditText>
您可以将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:这是处理这个问题的正确方法,但应该注意,您在此处所做的更改通常会以递归方式再次调用TextWatcher。通常情况下,通过检查布尔“编辑”标志来对这些更改进行包装,以便递归调用跳过并在更改来自内部时简单地返回。 – Devunwired 2011-03-22 13:16:44
试试这个..
EditText.setOnEditorActionListener(new OnEditorActionListener()
{
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
//add your condtion here.
return false;
}
});
为什么不使用搜索条相反的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。虽然,它的精确度是有问题的。
非常有趣的问题。
我想最好的办法是实现一个新的inputType
,但setInputType方法收到一个int。无事可做有:(
在该方法的文档,它说:
设置为的inputType 该定义将改变 关键听众的关心与 不变的内容的类型,通过调用 setKeyListener(KeyListener的),匹配 给定的内容类型。
优秀,可以为用户提供一个setKeyListenerkeyListener
。
您可以扩展android.text.method.DigitsKeyListener
以创建新的keyListener
,避免了TextWatcher
的问题。
我没有足够的特权来评论Ashok Felix的答案,但是我想补充一点,我已经发现一些代码预先在首选项中显示SeekBar。
这是非常容易使用(我不是作者)。请参阅Matthew Wiggins的SeekBarPreference代码:http://android.hlidskialf.com/blog/code/android-seekbar-preference
这是有效的,但不是实时的。
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) {
}
}
});
我所遇到的一个巧妙的解决办法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});
阅读这个问题几次后,它的不清楚在用户打字时或在离开现场后你是否希望验证和编辑输入。在这两种情况下,你都有两个答案。 – Devunwired 2011-03-22 13:19:19