货币格式仅适用于一个动态EditText,而不适用于其他动态格式

时间:2013-03-08 00:22:39

标签: java android android-edittext textwatcher

以下for循环会根据项目的大小添加x行数:

for (int i = 0; i < shoppingQuantityAndItems.size(); i++) {
    TableRow label = new TableRow(this);

    EditText quantity = new EditText(this);
    quantity.setInputType(InputType.TYPE_CLASS_NUMBER);
    quantity.setText(shoppingQuantityAndItems.get(i).get(0));
    System.out.println("Size: "
            + shoppingQuantityAndItems.get(i).get(0));
    label.addView(quantity);

    TextView items = new TextView(this);
    items.setText(shoppingQuantityAndItems.get(i).get(1));
    System.out.println("Item: "
            + shoppingQuantityAndItems.get(i).get(1));
    label.addView(items);

    price = new EditText(this);
    price.setId(i);
    price.setInputType(InputType.TYPE_CLASS_NUMBER
            | InputType.TYPE_NUMBER_FLAG_DECIMAL);
    price.setText("");
    label.addView(price);
    updatePrice(price.getId());

    CheckBox ch = new CheckBox(this);
    ch.setChecked(false);
    label.addView(ch);

    table.addView(label);
}

因为我希望每个不同价格EditText字段在用户输入时具有不同的值,所以我使用其唯一ID调用方法:

public void updatePrice(int id){
    updatedPrice = (EditText) price.findViewById(id);
    updatedPrice.addTextChangedListener(new TextWatcher() {

        private String current = "";

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (!s.toString().equals(current)) {
                updatedPrice.removeTextChangedListener(this);
                String cleanString = s.toString().replaceAll("[£,.]", "");
                double parsed = Double.parseDouble(cleanString);           
                String formated = NumberFormat.getCurrencyInstance()
                        .format((parsed/100));          
                current = formated;
                updatedPrice.setText(formated);
                updatedPrice.setSelection(formated.length());
                updatedPrice.addTextChangedListener(this);
            }
        }

我只是想知道是否有人可以告诉我如何确保在任何这些文本字段中输入数字时,只有该值会发生变化,而不是其他值。

1 个答案:

答案 0 :(得分:0)

您使用了错误的EditText小部件。

updatedPrice可能是您班级的数据成员。这不是一个好主意,因为您没有这些EditText小部件中的一个。

此外,您的onTextChanged()会假定updatedPrice将指向正确的EditText窗口小部件 - 用户恰好输入的窗口小部件 - 并且在统计上不太可能。< / p>

假设代码的其余部分实际上是您想要的,那么您需要更改:

updatedPrice = (EditText) price.findViewById(id);

是:

final EditText updatedPrice = (EditText) price.findViewById(id);

这会导致TextWatcher匿名内部类使用您在updatedPrice电话时检索的updatePrice(),而不是您在EditText电话中使用的TextWatcher该类的数据成员。

或者,您可以findViewById()执行updatedPrice本身。无论哪种方式都应该有效。

我建议您删除{{1}}数据成员并修复其余代码,因为您可能有其他类似的错误。