我正在使用android的TextWatcher执行此操作:当用户键入时,保存键入的内容并在保存后更改Edittext中的字符。例如,我有一个像“hi im happy”这样的常量文本,我在edittext用户中输入的每个东西都看到这个文本正在写(这个字符串在用户输入时显示Tandemly)!但是用户输入的主要文本,存储在变量中。我在afterTextChanged:
中使用此代码if(s.toString().charAt(s.length()-1) != 'a'){
//save inside freaktext variable(append)
freaktext=freaktext+s.toString().charAt(s.length()-1);
//change edittext value(what user see's)
txtfreak.setText(s.toString().substring(0, s.length()-1) + "a");
txtfreak.setSelection(txtfreak.getText().length());
}else{
freaktext=freaktext+"a";
}
我说这个代码,如果键入的字符不是“a”,则将其保存在名为“freaktext”的变量上,然后更改edittext值并将“a”字符放在edittext内的字符串末尾。但如果用户输入“a”,只需将其保存在freaktext中。
我的问题是:当用户键入一个无“a”字符时,一切正常,我的代码保存键入的字符,然后修改edittext值,但当edittext值更改时,整个代码再次运行,因为上次我更改它和将“a”放入其中,我的代码的第二部分(else)运行并再次将“a”保存到已保存字符串的末尾。事实上,当我输入“q”时,我在保存的字符串中看到“qa”!!我希望只是用户直接在键盘中键入“a”,“a”保存,在其他情况下不保存。事实上,我的其他部分仅在用户直接按下键盘上的“a”键时运行。我可以这样做吗?请帮帮我,这段代码浪费我一天的时间
答案 0 :(得分:3)
在你的职能之外,某处:
boolean weChangedIt = false;
内部afterTextChanged
:
if (weChangedIt) {
weChangedIt = false;
} else {
if(s.toString().charAt(s.length()-1) != 'a'){
weChangedIt = true;
freaktext=freaktext+s.toString().charAt(s.length()-1);
txtfreak.setText(s.toString().substring(0, s.length()-1) + "a");
txtfreak.setSelection(txtfreak.getText().length());
}else{
freaktext=freaktext+"a";
}
}
答案 1 :(得分:1)
txtfreak.removeTextChangedListener(whateveryourlistenername);
if(s.toString().charAt(s.length()-1) != 'a'){
freaktext=freaktext+s.toString().charAt(s.length()-1);
txtfreak.setText(s.toString().substring(0, s.length()-1) + "a");
txtfreak.setSelection(txtfreak.getText().length());
}else{
freaktext=freaktext+"a";
}
txtfreak.addTextChangedListener(whateveryourlistenername);