如何解决如何根据输入的特定值更改 Android 上的 EditText?
我希望用户更改一些设备设置,例如在 X 秒(默认 5 秒)后运行警报。我希望用户能够输入他们想要的内容(来自编辑文本的数字值),但如果他们输入的值不在 2 到 20 秒之间,我希望编辑文本默认为 5 秒。
最好的方法是什么?我尝试过观察者,但我认为我陷入了无限循环。
//Settings distance edit text
settings_distance_edit.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s,int start,int before,int count) {
int settings_distance_edit_value = Integer.parseInt(settings_distance_edit.getText().toString()+"");
if (settings_distance_edit_value >= disTANCE_MIN && settings_distance_edit_value <= disTANCE_MAX) {
Log.v("Tag",settings_distance_edit_value+"");
} else {
settings_distance_edit.setText(disTANCE_DEFAULT+"");
}
}
@Override
public void beforeTextChanged(CharSequence s,int count,int after) {
// Todo Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
}
});
解决方法
我想你可以这样做
- 您可以在不使用 TextWatcher 的情况下检查该值
int settings_distance_edit_value = Integer.parseInt(settings_distance_edit.getText().toString()+"");
if (settings_distance_edit_value >= DISTANCE_MIN && settings_distance_edit_value <= DISTANCE_MAX) {
// you set your default value
settings_distance_edit.setText("5s");
} else {
settings_distance_edit.setText(DISTANCE_DEFAULT+"");
}
,
尝试输入过滤器
public class InputFilterMinMax implements InputFilter
{
private final int min;
private final int max;
private final UtilityListener utilityListener;
public InputFilterMinMax(int min,int max,UtilityListener utilityListener)
{
this.min = min;
this.max = max;
this.utilityListener = utilityListener;
}
@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;
}
else
{
utilityListener.getItem("Value cannot exceed " + max);
}
}
catch (NumberFormatException ignored)
{
utilityListener.getItem("NumberFormatException");
}
return "";
}
private boolean isInRange(int a,int b,int c)
{
return b > a ? c >= a && c <= b : c >= b && c <= a;
}
}
活动代码
binding.editText.setFilters(new InputFilter[]{new InputFilterMinMax(1,10,object ->
{
String message = (String) object;
Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();
})});
听众
public interface UtilityListener
{
void getItem(Object object);
}
,
1.for integer input set your EditText digits="0123456789"
2. In if condition you should use || condition instead of &&
3. also check if input is not empty as given below.
this is working fine,no infinite loop
var MIN=2
var MAX=20
var DEF=5
et_distance.addTextChangedListener(object : TextWatcher {
override fun onTextChanged(s: CharSequence?,start: Int,before: Int,count: Int) {
if (et_distance.text.toString().isNotEmpty()) {
var etValue = et_distance.text.toString().toInt()
if (etValue >= MAX || etValue <= MIN){
et_distance.setText(DEF.toString())
}
else {
Log.d("TAG","onTextChanged: $etValue")
}
}
}
override fun beforeTextChanged(s: CharSequence?,start:Int,count: Int,after: Int) {
}
override fun afterTextChanged(s: Editable?) {
}
})
,
您不应将 addTextChangedListener()
用于此目的。
您应该等待用户按下键盘上的 Enter 或 done 键。这可以通过以下代码实现:
settings_distance_edit.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v,int actionId,KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || event != null && event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
if (event == null || !event.isShiftPressed()) {
// the user is done typing and has submitted the input.
// your code
int settings_distance_edit_value = Integer.parseInt(settings_distance_edit.getText().toString()+"");
if (settings_distance_edit_value >= DISTANCE_MIN && settings_distance_edit_value <= DISTANCE_MAX) {
Log.v("Tag",settings_distance_edit_value+"");
} else {
settings_distance_edit.setText(DISTANCE_DEFAULT+"");
}
return true;
}
}
return false; // the user has not submitted the input yet.
}
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。