我正在寻找一种方法来限制我在EditText字段中输入的数字,但我遇到了一些障碍。
我已经彻底研究过我的问题的解决方案,我将在下面详细说明。
我想创建4个不同的EditText字段,其中每个字段都接受以下范围:(1,24); (80,200); (1,999); (40,70)。
为简单起见,这些不是小数(或双精度/浮点数/长整数),而只是整数。
我已经研究过以下链接提供的解决方案,并提供了它们的缺点。
Android: Limiting EditText to numbers 此解决方案仅告诉我如何将输入的文本限制为仅数字数据。它不提供范围。
Is there a way to define a min and max value for EditText in Android? 已接受的解决方案确实完成了设置范围的目标,但问题在于它仅适用于范围(1,24)和(1,999),因为它的实现。问题是,如果我在间隔(40,70)或(80,200)中查找值,我将从一次输入一个数字开始,因此这不起作用。它将拒绝单个数字输入,这使得它非用户友好。
How to limit the text in numbers only from 0-59 in Edit Text in Android? 我相信这里接受的解决方案与上面的解决方案有同样的问题,因为它一次只需要一位数。我考虑在afterTextChanged下使用相同的方法而不是onTextChanged,但无济于事。
Number range on an edittext - only want numbers between 1 and 10 此解决方案包括单击按钮以评估该数字是否落在给定范围内,因此这将被视为“事后”解决方案。我需要一个可以实时拒绝用户输入的EditText。
非常感谢您的帮助,这可能有助于解决许多其他人显然遇到的问题(阅读评论,其他人似乎希望范围不以一位数字开头/结尾)。
答案 0 :(得分:3)
使用Textwatcher, 这里我有一个edittext,如果他输入1-24范围内的数字,我允许用户
public class MainActivity extends AppCompatActivity {
EditText et;
int num1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et= (EditText) findViewById(R.id.edit_text);
et.addTextChangedListener(textWatcher);
}
TextWatcher textWatcher =new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(et.getText().length()>0) {
int num = Integer.parseInt(et.getText().toString());
if (num>=1 && num<=24)
{
//save the number
num1=num;
}
else{
Toast.makeText(MainActivity.this,"Please enter the code in the range of 1-24",Toast.LENGTH_SHORT).show();
et.setText("");
num1=-1;
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
}
这是xml文件
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edit_text"
android:inputType="number"
/>
最后别忘了检查
if(num1==-1)
{
Toast.makeText(MainActivity.this,"Please fill all the fields",Toast.LENGTH_SHORT).show();
}
答案 1 :(得分:0)
我到目前为止找到的最佳答案是基于以下链接的解决方案,但它有一个缺点:(https://stackoverflow.com/a/28743065/5906258)
缺点是,一旦我们不再将输入插入EditText,EditText框就会保留这些值(而不是清除)。
我的(编辑过的)代码如下:
头等课InputFilterMax
:
package test;
import android.text.InputFilter;
import android.text.Spanned;
// more imports
public class InputFilterMax implements InputFilter {
private int max;
private Context context;
public InputFilterMax(Context con, int max) {
this.max = max;
this.context = con;
}
public InputFilterMax(Context con, String max) {
this.max = Integer.parseInt(max);
this.context = con;
}
@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) {
Toast.makeText(context, "Number not accepted! Must be below or equal to " + max, Toast.LENGTH_SHORT).show();
return null;
}
return "";
}
}
第二课OnFocusChangeListenerMin
:
package test;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnFocusChangeListener;
// more imports
public class OnFocusChangeListenerMin implements OnFocusChangeListener {
private int min;
private Context context;
public OnFocusChangeListenerMin(Context con, int min) {
this.min = min;
this.context = con;
}
public OnFocusChangeListenerMin(Context con, String min) {
this.min = Integer.parseInt(min);
this.context = con;
}
@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){
Toast.makeText(context, "Number not accepted! Must be above or equal to " + min, Toast.LENGTH_SHORT).show();
}
}
}
}
}
然后在Activity中我使用以下代码来应用过滤器和监听器:
timeEdit = (EditText)findViewById(R.id.query_time_frame);
timeEdit.setFilters(new InputFilter[]{new InputFilterMax(getApplicationContext(), 24)}); // max limit on time
timeEdit.setOnFocusChangeListener(new OnFocusChangeListenerMin(getApplicationContext(), 1)); // min limit on time
如果有人能帮助我解决我遇到的最后一个问题,我们将不胜感激。
答案 2 :(得分:0)
您可以尝试使用TextWatcher的afterTextChanged回调。看看我是如何实现它的。
private TextWatcher tollTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() > 0) {
int val = Integer.valueOf(editable.toString());
if (val > MAX_VALUE) {
edit_toll.setText("");
edit_toll.setError("Rs.1 - Rs.500");
}
}
}
};