Java EditText-在键入时更改文本
键入时,我需要替换EditText中的文本: 示例:如果用户按下“A”,则会将其存储到缓冲区中,并在编辑文本上显示“D”(看起来他按下了“D”)。 现在我可以读取按下的字符,但我无法在et中显示任何字符,以避免堆栈溢出:Java EditText-在键入时更改文本,java,android,Java,Android,键入时,我需要替换EditText中的文本: 示例:如果用户按下“A”,则会将其存储到缓冲区中,并在编辑文本上显示“D”(看起来他按下了“D”)。 现在我可以读取按下的字符,但我无法在et中显示任何字符,以避免堆栈溢出: final EditText et = (EditText) findViewById(R.id.editTexts); final TextView tv = (TextView) findViewById(R.id.textView2); et.addTe
final EditText et = (EditText) findViewById(R.id.editTexts);
final TextView tv = (TextView) findViewById(R.id.textView2);
et.addTextChangedListener(new TextWatcher()
{
public void afterTextChanged(Editable s){}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(s.length() > 0) {
tv.setText(s.toString().substring(s.length()-1));
et.setText("");
}
}
});
您可以根据需要进行更改::
public class SampleActivity extends Activity {
TextWatcher tt = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final EditText et = (EditText) findViewById(R.id.editText1);
final TextView tv = (TextView) findViewById(R.id.textView1);
tt = new TextWatcher() {
public void afterTextChanged(Editable s){
et.setSelection(s.length());
}
public void beforeTextChanged(CharSequence s,int start,int count, int after){}
public void onTextChanged(CharSequence s, int start, int before, int count) {
et.removeTextChangedListener(tt);
et.setText(et.getText().toString().replace("A", "C"));
et.addTextChangedListener(tt);
}
};
et.addTextChangedListener(tt);
}
}
要以交互方式更改文本,您需要注册
TextWatcher
。但是试图更改观察者内部的文本会创建对观察者的进一步调用。我的方法是,当我想更改文本时,临时删除watcher,然后立即重新注册
mEditText.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) { }
@Override public void afterTextChanged(Editable editable) {
mEditText.removeTextChangedListener(this);
mEditText.setText(//TODO change whatever you like here);
mEditText.setSelection(editable.length()); //moves the pointer to end
mEditText.addTextChangedListener(this);
}
看这个。。。。。。。。。。。。。。。。。。。。。。。。。。试试s.clear();在将s设置为您的文本视图相同问题两次后,它不是相同的问题!!et将“a”替换为“c”,但它是相反的,它在字段的开头添加了字符,可能它需要一个et.setSelection(s.length());某处!!我在调用
et.removeTextChangedListener(tt)
时遇到编译器错误。它抱怨tt
可能未初始化。您可以通过简单地用this
替换tt
来避免这种情况。您不是要调用addTextChangedListener
两次吗?一个调用在onTextChanged
中,另一个调用在onCreate