检测EditText中的更改(TextWatcher无效)

时间:2012-02-27 02:54:37

标签: android android-edittext textwatcher

我需要检测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“。

我怎样才能做到这一点?我想不出可靠的方法来做到这一点。

3 个答案:

答案 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?) { }