2012-02-27 21 views
5

EditTextでテキストの変更を検出する必要があります。私はTextWatcherを試しましたが、それは私がそれを期待する方法で動作しません。 onTextChanged方法を取る:EditTextの変更を検出する(TextWatcherは無効です)

public void onTextChanged(CharSequence s, int start, int before, int count)

は、私がのEditTextで既にテキスト「ジョン」を持っていると言います。別のキー "e"を押すと、 "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 

私はキーが押されるたびに、個々の変更を検出できるようにする必要があります。だから私はテキスト "ジョン"がある場合、私は "e"がインデックス4に追加されたことを知る必要があります。 "e"をバックスペースすると、 "e"がインデックス4から削除されたことを知る必要があります。バックスペースでは、 "J"がインデックス0から削除されたことを知る必要があります。 "G"を "J"にした場合、インデックス "0"で "G"を "J"に置き換えます。

私はこれを達成することはできますか?私はこれを行うための信頼できる方法を考えることができません。

+0

は、クリップボードから貼り付けについてのEditText –

+0

何のためにonKeyListenerみては? –

+0

もう1つの問題は、テキスト範囲が選択されているということです。任意のTextWatcherメソッドで、テキストが選択されているかどうかにかかわらず、getSelectionStartとEndは常に同じインデックスです。 –

答えて

9

テキストウォッチャーを使用して、diffを自分で実行してください。ウォッチャーの中に前のテキストを格納してから、前のテキストとonTextChangedを取得したシーケンスを比較します。 onTextChangedはすべての文字の後に開始されるので、あなたは前のテキストを知っていて、与えられたテキストは最大で1文字だけ異なるので、どこに文字が追加または削除されたかを簡単に把握できるはずです。すなわち:

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; 
    } 

    ... 
} 
+0

これは私が考えている、そして確かに実行可能な提案ですが、私は簡単に「ここに行きます!」と期待していました。メソッドが存在しない可能性があります。あなたのアプローチの唯一の問題は、テキストが1文字以上異なることです(選択範囲、クリップボードからの貼り付け)。 –

+1

真実ですが、その時点でインデックスはほとんど意味がありません(たとえば、現在のテキストの前に単語を貼り付けるとどうなりますか?)、それでもdiffを自分で行うことはできます。私は、あなたがしようとしていることのためのソリューションが組み込まれているとは思わない。 –

+0

十分に公正です。あなたが言ったことをやってしまい、基本的に私自身のTextWatcherを実装し、私が期待していた値を渡しました。それは100%ばかげた証拠ではないが、かなり近い。 –

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) 
    { 
    } 
}); 
関連する問題