Задать вопрос
@Axe98
Junior Programmer

Ввод в EditText. Как сделать, чтобы при вводе числа в конце приписывался знак доллара?

Здравствуйте. Пишу конвертер валют. Хочу сделать, чтобы при вводе суммы в конце добавлялся значок доллара. Пытался сделать через "TextWatcher" :
final EditText enter = (EditText) findViewById(R.id.enter);
final TextView result = (TextView) findViewById(R.id.result);

 enter.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {

            }

            @Override
            public void afterTextChanged(Editable s)
            {
                if(enter.getText().length()!=0)
                {
                    String ss= enter.gettext().toString();
                    ss= ss + "$";
                    enter.settext(ss);
                }
                else
                {
                    result.setText(null);
                }


            }
        });


P.S. Программа крэшится! Что не так? Заранее благодарю.
  • Вопрос задан
  • 1818 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
VYakushev
@VYakushev
Разработчик Android в Nowtaxi
Как сказал ivanfenenko проблема в рекурсии. Сделайте так:
enter.addTextChangedListener(new TextWatcher() {
    
    private boolean mFormating;

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        if (!mFormating) {
            mFormating = true;
            if(enter.getText().length() != 0) {
                String ss= s.toString();
                if (!ss.endsWith("$")) {
                    ss= ss + "$";
                    enter.setText(ss);
                }
            } else {
                result.setText(null);
            }
            mFormating = false;
        }
    }
});

  1. Во-первых, выставляем флаг, чтобы не запускать код при изменении текста нашим кодом
  2. Во-вторых, добавляем проверку наличия знака '$' в конце, а то при каждой правке он у нас будет дописываться
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
anyd3v
@anyd3v
Не проще ли сделать значок рядом с EditText? Что будет если пользователь поставит корретку в конец и продолжит вводить цифры? Мне кажется вы выбрали не очень удачный способ
Ответ написан
@ivanfenenko
крешится потому что у вас рекурсия вышла на afterTextChanged
Ответ написан
Комментировать
redsabien
@redsabien
Ну с кореткой и вправду беда, но можно сделать чтобы он мог удалять этот символ, а потом когда опять сумму вводит то он опять появиться(или как только начнят удалять коретка перепрыгивает и удаляет цифры до текста)

Overrided
public void afterTextChanged(Editable s) {
Log.d(TAG, "AFTER");
if(!TextUtils.isEmpty(s)) {
if (!(s.charAt(s.length() - 1) == '$')) {

String dollarSign = s.toString() + '$';
etName.setText(dollarSign);
}
}
}

В общем что тут происходит. Нельзя добавлять символы в Editable в AfterTextChanged. Потому что как только это сделано он опять перевызывает все методы и так циклично и поэтому там вылетает соощения

Относительно кода, как только ктото введет сумму ему сразу прибавиться этот символ (я не делал так чтобы его можно было удалить, если не получиться напиши добавлю код)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы