![](/img/trans.png)
[英]when setText on editText TextWatcher.onTextChanged not called
[英]TextWatcher not executing several setText llines
使用 TextWatcher 更改字母,它似乎只執行最后一行(例如,它將c
更改為3
但忽略之前的更改。如果我刪除最后一行(c 到 3)它只會開始將b
更改為2
。我不確定這是為什么或如何解決它。(Java 對我來說是新手)
public class MainActivity extends AppCompatActivity {
TextWatcher tt = null;
private TextView textView;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText et = (EditText) findViewById(R.id.editText);
final TextView tv = (TextView) findViewById(R.id.textView);
tt = 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) {
et.removeTextChangedListener(tt);
tv.setText(et.getText().toString().replace("a", "1"));
tv.setText(et.getText().toString().replace("b", "2"));
tv.setText(et.getText().toString().replace("c", "3"));
et.addTextChangedListener(tt);
}
@Override
public void afterTextChanged(Editable s) {
et.setSelection(s.length());
}
};
et.addTextChangedListener(tt);
在提供的代碼中,為TextView
執行了 3 次setText
。 因此,它只保留最后一次調用的結果。 如果要顯示所有替換的結果,請在單個字符串中執行:
et.removeTextChangedListener(tt);
tv.setText(et.getText().toString().replace("a", "1").replace("b", "2").replace("c", "3"));
et.addTextChangedListener(tt);
編輯:
當然,您可以逐步執行轉換:
et.removeTextChangedListener(tt);
String s = et.getText().toString();
s = s.replace("a", "1");
s = s.replace("b", "2");
s = s.replace("c", "3");
tv.setText(s);
et.addTextChangedListener(tt);
方法String.replace
並沒有改變String,而是返回一個新的,所以我們需要重新分配每個替換的結果(我只是一次又一次地分配給s
,以防止未使用的引用)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.