Формат валюты работает только для одного динамического 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
член данных и исправьте остальную часть вашего кода, так как у вас могут быть другие подобные ошибки.