TextWatcher 编辑文本
TextWatcher EditText
我在检查 EditText 时遇到问题。我需要用户输入 1-100 之间的值,如果该值超过应显示的吐司,并且应刷新 EditText 输入。请帮我处理 ontextChanged 部分。 toast 后应用程序崩溃了。任何帮助将不胜感激。
MainActivity.java
userInput 是 EditText 类型
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
progress.setText(" "+i);
}
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
userInput.addTextChangedListener(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) {
try {
int j = Integer.valueOf(userInput.getText().toString());
if(j > 100 || j < 1){
Toast.makeText(getApplicationContext(), "Please enter value between 1-100", Toast.LENGTH_SHORT).show();
}
} catch(NumberFormatException e) {
//do whatever you like when value is incorrect
}
}
@Override
public void afterTextChanged(Editable editable) {
String text = editable.toString();
if (!TextUtils.isEmpty(text)) {
seekBar.setProgress(Integer.parseInt(text));
}
else {
seekBar.setProgress(0);
}
}
});
在 onTextChanged 方法中执行此操作
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
try {
int j = Integer.valueOf(userInput.getText().toString());
if(j > 100 || j < 1){
Toast.makeText(getApplicationContext(), "Please enter value between 1-100", Toast.LENGTH_SHORT).show();
userInput.setText("")
} else {
seekBar.setProgress(j);
}
} catch(NumberFormatException e) {
//do whatever you like when value is incorrect
}
}
并从 afterTextChanged 方法中删除实现
按照@muminers 的回答,您应该将代码放在 onTextChangedMethod 中,因为即使某些控件在没有您直接交互的情况下更改了 editText 的值,也会调用 afterTextChanged 方法。它有时会创建一种循环。因此,当您在编辑文本中输入内容时,您在 afterTextChanged 方法中做了一些事情,该方法间接更改了相同的编辑文本,然后它进入了一个无限循环,导致应用程序崩溃。
我在检查 EditText 时遇到问题。我需要用户输入 1-100 之间的值,如果该值超过应显示的吐司,并且应刷新 EditText 输入。请帮我处理 ontextChanged 部分。 toast 后应用程序崩溃了。任何帮助将不胜感激。
MainActivity.java
userInput 是 EditText 类型
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
progress.setText(" "+i);
}
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
userInput.addTextChangedListener(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) {
try {
int j = Integer.valueOf(userInput.getText().toString());
if(j > 100 || j < 1){
Toast.makeText(getApplicationContext(), "Please enter value between 1-100", Toast.LENGTH_SHORT).show();
}
} catch(NumberFormatException e) {
//do whatever you like when value is incorrect
}
}
@Override
public void afterTextChanged(Editable editable) {
String text = editable.toString();
if (!TextUtils.isEmpty(text)) {
seekBar.setProgress(Integer.parseInt(text));
}
else {
seekBar.setProgress(0);
}
}
});
在 onTextChanged 方法中执行此操作
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
try {
int j = Integer.valueOf(userInput.getText().toString());
if(j > 100 || j < 1){
Toast.makeText(getApplicationContext(), "Please enter value between 1-100", Toast.LENGTH_SHORT).show();
userInput.setText("")
} else {
seekBar.setProgress(j);
}
} catch(NumberFormatException e) {
//do whatever you like when value is incorrect
}
}
并从 afterTextChanged 方法中删除实现
按照@muminers 的回答,您应该将代码放在 onTextChangedMethod 中,因为即使某些控件在没有您直接交互的情况下更改了 editText 的值,也会调用 afterTextChanged 方法。它有时会创建一种循环。因此,当您在编辑文本中输入内容时,您在 afterTextChanged 方法中做了一些事情,该方法间接更改了相同的编辑文本,然后它进入了一个无限循环,导致应用程序崩溃。