我需要检测EditText中的文本更改。我已经尝试过TextWatcher,但是它没有按照我期望的方式工作。采用onTextChanged方法:
public void onTextChanged( CharSequence s, int start, int before, int count )
说我在EditText中已经有了“John”文本。如果按另一个键,“e”,s
将为“Johne”,start
将为0,before
将为4,count
将为5。我希望这种方法可以实现EditText之前的内容与它即将成为的内容之间的区别。
所以我希望:
s = "Johne"
start = 4 // inserting character at index = 4
before = 0 // adding a character, so there was nothing there before
count = 1 // inserting one character
每次按下按键,我都需要能够检测到个别更改。因此,如果我有文本“John”,我需要知道索引4处添加了“e”。如果我退格“e”,我需要知道“e”已从索引4中删除。如果我将光标放在“J”之后“和退格,我需要知道”J“已从索引0中删除。如果我将”G“放在”J“中,我想知道”G“在索引0处替换为”J“。
我怎样才能做到这一点?我想不出可靠的方法来做到这一点。
答案 0 :(得分:10)
使用textwatcher并自己做差异。将前一个文本存储在观察者中,然后将之前的文本与您在onTextChanged上获得的任何序列进行比较。由于onTextChanged在每个字符后被触发,因此您知道您之前的文本和给定的文本最多只有一个字母,这样可以很容易地找出添加或删除的字母。即:
new TextWatcher(){
String previousText = theEditText.getText();
@Override
onTextChanged(CharSequence s, int start, int before, int count){
compare(s, previousText); //compare and do whatever you need to do
previousText = s;
}
...
}
答案 1 :(得分:0)
每次更改文本时,您都需要存储和更新以前的CharSequence。您可以通过实施TextWatcher来实现。
示例:
final CharSequence[] previousText = {""};
editText.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)
{
if(i1 > 0)
{
System.out.println("Removed Chars Positions & Text:");
for(int index = 0; index < i1; index++)
{
System.out.print((i + index) + " : " + previousText[0].charAt(i + index)+", ");
}
}
if(i2 > 0)
{
System.out.println("Inserted Chars Positions & Text:");
for(int index = 0; index < i2; index++)
{
System.out.print((index + i) + " : " + charSequence.charAt(i + index)+", ");
}
System.out.print("\n");
}
previousText[0] = charSequence.toString();//update reference
}
@Override public void afterTextChanged(Editable editable)
{
}
});
答案 2 :(得分:0)
您可以遵循的识别文本更改的最佳方法。
var previousText = ""
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
previousText = s.toString()
}
override fun onTextChanged(newText: CharSequence?, start: Int, before: Int, count: Int) {
val position = start + before ;
if(newText!!.length > previousText.length){ //Character Added
Log.i("Added Character", " ${newText[position]} ")
Log.i("At Position", " $position ")
} else { //Character Removed
Log.i("Removed Character", " ${previousText[position-1]} ")
Log.i("From Position", " ${position-1} ")
}
}
override fun afterTextChanged(finalText: Editable?) { }