2011-09-15 47 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相匹配。

例如,当我有一个文本 x =“123-456-789” 我从x手动删除文本“456”。 格式化后,我可编辑的值为“123-789-” 然而,在我的EditText显示的数值为“123--789”

他们在大多数情况下,相同的值,但。

我认为EditText是可编辑的,它们应该始终匹配。我错过了什么吗?

+0

你能显示代码? – slayton

+0

注释中的代码几乎不可读。您能否将代码添加到代码块中的原始文章中,以便我可以阅读它? – slayton

+0

@slayton对不起!我已将代码添加到我的原始帖子中。谢谢。 – Karthz

回答

5

好吧,你从来没有真正改变EditText只是可编辑。 Android EditTexts不是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; 
} 

注:在您更改的EditText /可编辑文本我没有测试过这

+0

谢谢。我也尝试过,它给了我预期的结果。但是,这大大减缓了投入。我不得不等待输入每个数字。所以,我认为这个想法是不正确的。 – Karthz

+0

这并不令人感到意外,因为每次输入新数字时,监听器都会被调用。每次输入数字时,您都不需要重新格式化字符串,只有当字符串达到特定长度时才行。尝试将if子句放在格式化字符串中立即返回的formatText()方法的开头太短或isn没有合适的长度。 – slayton

+0

太好了,谢谢。我会尝试一下,看看它是否更快。 – Karthz

相关问题