Формат валюты работает только для одного динамического EditText, а не для других

Следующие 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 Чтобы иметь разные значения, когда пользователь вводит их, я вызываю метод с их уникальным идентификатором:

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 ответ

Решение

Вы используете неправильно EditText виджет.

updatedPrice предположительно является членом данных вашего класса. Это не очень хорошая идея, так как у вас нет только одного из них EditText виджеты.

Кроме того, ваш onTextChanged() предполагает, что updatedPrice будет указывать на право EditText виджет - тот, в который пользователь вводит - и статистически это маловероятно.

Предполагая, что остальная часть кода на самом деле то, что вы хотите, то вам нужно изменить:

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

быть:

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

Это приведет к вашему TextWatcher анонимный внутренний класс, чтобы использовать updatedPrice вы получаете во время updatePrice() звонок, а не какой-то случайный EditText что у вас есть в элементе данных класса.

Или вы могли бы иметь TextWatcher сделать findViewById() сам. В любом случае должно работать.

Я бы порекомендовал просто избавиться от updatedPrice член данных и исправьте остальную часть вашего кода, так как у вас могут быть другие подобные ошибки.

Другие вопросы по тегам