2011-09-15 35 views
4

私はEditTextとTextWatcherを持っています。TextWatcherでテキストを変更した後にEditTextが更新されない

私のコードのスケルトン:

EditText x; 
x.addTextChangedListener(new XyzTextWatcher()); 

XyzTextWatcher implements TextWatcher() { 
    public synchronized void afterTextChanged(Editable text) { 
     formatText(text); 
    } 
} 

マイformatText()メソッドは、テキストのいくつかの位置で、いくつかのハイフンを挿入します。

private void formatText(Editable text) { 
    removeSeparators(text); 

    if (text.length() >= 3) { 
     text.insert(3, "-"); 
    } 
    if (text.length() >= 7) { 
     text.insert(7, "-"); 
    } 
} 

private void removeSeparators(Editable text) { 
    int p = 0; 
    while (p < text.length()) { 
     if (text.charAt(p) == '-') { 
      text.delete(p, p + 1); 
     } else { 
      p++; 
     } 
    } 
} 

私の問題は、私のEditTextに表示されているものが、編集可能なものと同期していないことです。コードをデバッグすると、可変テキスト(Editable)が期待値を持つことがわかりましたが、EditTextに表示されているものが必ずしもEditableと一致するわけではありません。例えば

Iテキスト X = "123-456-789" を持っている場合、私は手動でXからテキスト "456" を切断します。フォーマット後、私の編集可能な値を持っている 「123-789-」 は、しかし、私のEditTextに示す値は「123--789」

である彼らは、しかし、ほとんどの場合、同じ値を持っています。

私は、EditTextが編集可能であり、それらは常に一致していると仮定しました。何か不足していますか?

+0

をテストしていませんが、あなたがのEditText /編集可能なテキストを変更するコードを表示することができますか? – slayton

+0

コメントのコードはほとんど読めません。私はそれを読むことができるようにコードブロック内の元の投稿にそのコードを追加していただけますか? – slayton

+0

@slaytonそれは申し訳ありません!元の投稿にコードを追加しました。ありがとう。 – Karthz

答えて

5

[OK]をクリックします。 Android EditTextはEditableクラスの子ではありません。文字列はEditableクラスのサブクラスです。 onTextChangedListenerは、引数としてEditTextを受け取るのではなく、EditTextに表示されるEditable/Stringを受け取ります。 のハイフンで編集可能な書式を設定したら、EditTextを更新する必要があります。このようなものがうまくいくはずです:

class MyClass extends Activity{ 

    //I've ommited the onStart(), onPause(), onStop() etc.. methods 

    EditText x; 
    x.addTextChangedListener(new XyzTextWatcher()); 

    XyzTextWatcher implements TextWatcher() { 
     public synchronized void afterTextChanged(Editable text) { 
      String s = formatText(text); 
      MyClass.this.x.setText(s); 
     } 
    } 

} 

減速を防ぐには、formatTextメソッドをこのように変更しないでください。

private Editable formatText(Editable text) { 
    int sep1Loc = 3; 
    int sep2Loc = 7; 

    if(text.length==sep1Loc) 
    text.append('-'); 

    if(text.length==sep2Loc) 
    text.append('-'); 

    return text; 
} 

注:私はこの

+0

ありがとうございます。私もそれを試みました、そして、それは私に期待された結果を与えました。しかし、入力を大幅に遅くしました。私はすべての数字を入力するために少し待たなければならなかった。だから、そのアイデアは正しいとは思っていませんでした。 – Karthz

+0

これは驚くことではありません。なぜなら、新しい数字を入力するたびにリスナーが呼び出されるからです。文字列が特定の長さに達したときにのみ、数字が入力されるたびに文字列を再フォーマットする必要はありません。文字列内ですぐに返されるformatText()メソッドの先頭にif節を置くと、正しい長さです。 – slayton

+0

よかった、ありがとう。私はそれを試し、それがより速くなるかどうかを見ます。 – Karthz

関連する問題