添加 TextChanged 实现后清除 EditText 文本
Posted
技术标签:
【中文标题】添加 TextChanged 实现后清除 EditText 文本【英文标题】:Clear EditText text after adding onTextChanged implemenation 【发布时间】:2011-04-06 13:45:43 【问题描述】:我正在向 EditText 字段添加一个侦听器,以便将数字实时格式化为货币。
loanText.addTextChangedListener(new TextWatcher()
private String current = "";
public void onTextChanged(CharSequence s, int start, int before, int count)
if(!s.toString().equals(current))
String cleanString = s.toString().replaceAll("[$,.]", "");
double parsed = Double.parseDouble(cleanString);
String formated = NumberFormat.getCurrencyInstance().format((parsed/100));
current = formated;
loanText.setText(formated);
loanText.setSelection(formated.length());
public void afterTextChanged(Editable s)
// TODO Auto-generated method stub
public void beforeTextChanged(CharSequence s, int start, int count,
int after)
// TODO Auto-generated method stub
);
但是,当我尝试清除 EditView 字段时,我的应用程序会崩溃。此外,退格键不再起作用。
【问题讨论】:
你能发布 logcat 的输出吗?我很好奇你得到的错误。由于无限循环,它可能是NumberFormatError
或(不太可能?)ANR。
尝试删除当前字符串并使用 if(s.toString().length() != 0)
请看这里:***.com/a/67753559/12272687
【参考方案1】:
问题是您的TextWatcher
看到您正在“清除”文本,因此向其回调方法(afterTextChanged
、beforeTextChanged
等)发送请求。
我所做的只是删除TextWatcher
,清除文本,然后将TextWatcher
back 添加到EditText
。这样一来,我的EditText
更改就不会被监听了。
您可能必须保留TextWatcher
的实例,而不是像您所做的那样内联它。这样你就不必每次想清除EditText
时都创建一个
loanText.removeTextChangedListener(yourTextWatcherObject);
loanText.setText("");
loanText.addTextChangedListener(yourTextWatcherObject);
【讨论】:
我建议使用布尔变量来控制监听器是否应该做任何事情。 它对我不起作用是否有示例代码或其他解决方案谢谢【参考方案2】:尝试使用
afterTextChanged
反而。我和另一个也有很多问题。
【讨论】:
【参考方案3】:我发现这门课对我很有帮助: http://www.java2s.com/Code/android/UI/ConvertinputvaluetoCurrencyinTextWatcher.htm
希望这会为你们节省一些时间。
【讨论】:
【参考方案4】:public class MainActivity extends Activity
EditText et;
TextWatcher tw;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et=(EditText) findViewById(R.id.et);
tw=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)
@Override
public void afterTextChanged(Editable s)
et.removeTextChangedListener(tw);
et.setText(Math.random()+"");//add your logic here
et.addTextChangedListener(tw);
;
et.addTextChangedListener(tw);
这是一个简单的解决方案。
【讨论】:
【参考方案5】:可以如下检查onTextChanged中的Text是否为空,如果为空则什么都不做
s.toString().isEmpty()
public void onTextChanged(CharSequence s, int start, int before, int count)
if(!s.toString().equals(current) && !s.toString().isEmpty())
String cleanString = s.toString().replaceAll("[$,.]", "");
double parsed = Double.parseDouble(cleanString);
String formated = NumberFormat.getCurrencyInstance().format((parsed/100));
current = formated;
loanText.setText(formated);
loanText.setSelection(formated.length());
【讨论】:
以上是关于添加 TextChanged 实现后清除 EditText 文本的主要内容,如果未能解决你的问题,请参考以下文章
delphi 如何实现grid组件在鼠标双击某一行后获得这一行的数据并将数据写到相应的edit中?
发出textChanged()信号时,获取TextEdit更改
TextBox.TextChanged & ICommandSource
edit this cookie chrome插件 (HttpAnalyzerStdV3 获取Cookie 后,再用edit this cookie添加cookie)