我想为EditText
定义一个最小值和最大值。
例如:如果任何人尝试在其中输入月值,则该值必须介于1-12之间。
我可以使用TextWatcher
来实现,但我想知道是否有其他方法可以在布局文件或其他地方实现。
编辑:我不想限制字符数。我想限制它的值。例如,如果我限制month EditText
w个字符,当我输入12时,它将接受它,但如果我输入22,它就不能在我输入时接受它。
发布于 2013-09-29 06:05:56
在Pratik的代码中有一个小错误。例如,如果值是10,并且您在开头添加1以使110,则filter函数会将新值视为101。
有关此问题的修复,请参阅以下内容:
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
try {
// Removes string that is to be replaced from destination
// and adds the new string in.
String newVal = dest.subSequence(0, dstart)
// Note that below "toString()" is the only required:
+ source.subSequence(start, end).toString()
+ dest.subSequence(dend, dest.length());
int input = Integer.parseInt(newVal);
if (isInRange(min, max, input))
return null;
} catch (NumberFormatException nfe) { }
return "";
}
发布于 2015-02-26 20:55:10
在我看到的@Patrik的解决方案和@Zac的添加中,提供的代码仍然有一个很大的问题:
如果为min==3
,则无法键入以1或2开头的任何数字(例如: 15,23)
如果为min>=10
,则不可能键入任何内容,因为每个数字都必须以1,2,3开头...
在我的理解中,我们不能通过简单地使用类InputFilterMinMax
来达到EditText
值的最小-最大限制,至少对于最小值不是这样,因为当用户输入一个正数时,值会增长,我们可以很容易地执行动态测试来检查它是否达到限制或超出范围并阻塞不符合的条目。测试最小值是另一回事,因为我们不能确定用户是否已经完成键入,因此不能决定是否应该阻止。
这并不完全是OP所要求的,但为了验证的目的,我在我的解决方案中结合了一个InputFilter
来测试最大值,以及一个OnFocusChangeListener
来在EditText
失去焦点时重新测试最小值,假设用户已经完成了输入,如下所示:
package test;
import android.text.InputFilter;
import android.text.Spanned;
public class InputFilterMax implements InputFilter {
private int max;
public InputFilterMax(int max) {
this.max = max;
}
public InputFilterMax(String max) {
this.max = Integer.parseInt(max);
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
try {
String replacement = source.subSequence(start, end).toString();
String newVal = dest.toString().substring(0, dstart) + replacement +dest.toString().substring(dend, dest.toString().length());
int input = Integer.parseInt(newVal);
if (input<=max)
return null;
} catch (NumberFormatException nfe) { }
//Maybe notify user that the value is not good
return "";
}
}
和OnFocusChangeListenerMin
package test;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnFocusChangeListener;
public class OnFocusChangeListenerMin implements OnFocusChangeListener {
private int min;
public OnFocusChangeListenerMin(int min) {
this.min = min;
}
public OnFocusChangeListenerMin(String min) {
this.min = Integer.parseInt(min);
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus) {
String val = ((EditText)v).getText().toString();
if(!TextUtils.isEmpty(val)){
if(Integer.valueOf(val)<min){
//Notify user that the value is not good
}
}
}
}
}
然后在Activity中将InputFilterMax
和OnFocusChangeListenerMin
设置为EditText
注意:在onFocusChangeListener
中可以同时设置最小值和最大值。
mQteEditText.setOnFocusChangeListener( new OnFocusChangeListenerMin('20');
mQteEditText.setFilters(new InputFilter[]{new InputFilterMax(getActivity(),'50')});
发布于 2019-11-27 18:11:16
Kotlin (如果有人需要它)(使用Utilities)
class InputFilterMinMax: InputFilter {
private var min:Int = 0
private var max:Int = 0
constructor(min:Int, max:Int) {
this.min = min
this.max = max
}
constructor(min:String, max:String) {
this.min = Integer.parseInt(min)
this.max = Integer.parseInt(max)
}
override fun filter(source:CharSequence, start:Int, end:Int, dest: Spanned, dstart:Int, dend:Int): CharSequence? {
try
{
val input = Integer.parseInt(dest.toString() + source.toString())
if (isInRange(min, max, input))
return null
}
catch (nfe:NumberFormatException) {}
return ""
}
private fun isInRange(a:Int, b:Int, c:Int):Boolean {
return if (b > a) c in a..b else c in b..a
}
}
然后在你的Kotlin类中使用这个
percentage_edit_text.filters = arrayOf(Utilities.InputFilterMinMax(1, 100))
此EditText允许从1到100。
然后在您的XML中使用它
android:inputType="number"
https://stackoverflow.com/questions/14212518
复制相似问题