EditText.setText()/ getText()似乎太慢,无法在TextWatcher中使用

时间:2014-07-02 08:06:56

标签: android

我有一个TextWatcher,它在EditText值前添加一个美元符号(它是一个价格字段)。一切正常,但如果你输入两个第一个数字足够快,第二个数字就不会出现。一旦你超过前两位数就可以了。如果你慢慢键入它们(几乎一秒钟之间),它也可以正常工作。 这是我正在使用的TextWatcher代码:

@AfterTextChange(R.id.add_itemPrice) // android annotations way
void addDollar(Editable e) {
    if (priceFieldBeingModified) {
        return;
    }
    if (!e.toString().startsWith(CURRENCY_SYMB)) {
        priceFieldBeingModified = true;
        String newValue = CURRENCY_SYMB + e;
        priceField.setText(newValue);
        if (priceField.getSelectionStart() == 0) {
            // move the cursor to the end
            priceField.setSelection(priceField.getText().length());
        }
        priceFieldBeingModified = false;
    }
}

priceField EditText具有固定的layout_width / layout_height(以dp为单位)。从我可以收集到的,setText()/ getText()太贵了,但在这种情况下我不知道如何避免它们。 priceField.getText().insert(0, CURRENCY_SYMB)由于某种原因没有做任何事情。

修改: 看起来问题只发生在Android 4.3(或Xperia Z手机)上。尝试了4.1手机 - 就像魅力一样。

任何建议都会受到赞赏,我对这个建议缺乏想法!

1 个答案:

答案 0 :(得分:0)

这对我来说很好:

@Override
public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
    if(s.toString().equalsIgnoreCase(""))
    {

    }

    else if (!s.toString().startsWith("$")) {
        priceFieldBeingModified = true;
        String newValue = "$" + s;
        e.setText(newValue);
        if (e.getSelectionStart() == 0) {
        // move the cursor to the end
        e.setSelection(e.getText().length());
    }
    priceFieldBeingModified = false;
}

它检查字符串是否为空并且它不以" $"开头,然后它添加" $"在开始时将光标移动到结束。