Как управлять EditText?

Я хочу контролировать EditText, который принимает только значения int. Пользователь вводит числа, затем я добавляю строку (простая часть). Но я хочу изменить его динамически, когда пользователь вводит числа. Как я могу этого добиться?

Я могу сделать следующее:
пользователь пишет 61, EditText вывод: 61 мин.
пользователь пишет 1314, затем EditText вывод: 13 мин 14 сек.

Вот проблема:
Если пользователь напишет 7699, ожидаемый вывод EditText будет: 76 мин 59 сек.

Я думаю, мне нужен контроллер, такой как метод getView() ArrayAdapter. Если пользователь пишет 1361, я должен сказать, чтобы телефон не печатал «13 мин 61 сек», а просто печатал «13 мин 59 сек» в EditText. Но я не знаю как.

Решение, которое я пробовал: Как остановить редактирование текста, чтобы добавить текст, когда в нем введен текст нужного формата?

Любая помощь будет оценена.


person Muhammed Aydogan    schedule 17.03.2020    source источник


Ответы (2)


Чтобы разрешить только числовые значения, вы можете использовать android:inputType="number" в XML-файле EditText.

Для отслеживания значения, записанного в EditText, вы можете прослушивать изменения EditText, используя метод addTextChangedListener и интерфейс TextWatcher.

 Timer timer = new Timer();
    final long DELAY = 2000; // in ms
    field1 = (EditText)findViewById(R.id.field1);

    field1.addTextChangedListener(new TextWatcher() {

        public void afterTextChanged(final Editable s) {
            // Do whatever you want with the updated value
            timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    // TODO: do what you need here
                    // you will probably need to use
                    // runOnUiThread(Runnable action) for some specific
                    // actions


                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            String minsString = "";
                            String secsString = "";
                            switch (s.length()) {
                                case 1:
                                    if (Integer.parseInt(String.valueOf(s)) == 0 || Integer.parseInt(String.valueOf(s)) == 1) {
                                        field1.setText(s + " min");
                                    } else {
                                        field1.setText(s + " mins");
                                    }
                                    break;
                                case 2:
                                    field1.setText(s + " mins");
                                    break;
                                case 3:
                                    minsString = s.toString().substring(0, 2);
                                    secsString = s.toString().substring(2);
                                    if (Integer.parseInt(secsString) > 59) {
                                        secsString = "59";
                                    }
                                    field1.setText(minsString + " mins " + secsString + " secs");
                                    break;
                                case 4:
                                    minsString = s.toString().substring(0, 2);
                                    secsString = s.toString().substring(2);
                                    if (Integer.parseInt(secsString) > 59) {
                                        secsString = "59";
                                    }
                                    field1.setText(minsString + " mins " + secsString + " secs");
                                    break;
                                default:
                                    break;
                            }
                        }
                    });

                }

            }, DELAY);

        }

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

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (timer != null)
                timer.cancel();
        }
    });

ссылаясь на решение таймера для предотвращения обновления экземпляра текста редактирования

person devMohaned    schedule 17.03.2020
comment
Он сам идет во внутренний цикл, никогда ничего не меняет. Всегда вызывает себя снова и снова перед изменением текста после запуска метода field1.setText. Я думаю, что мы не можем написать setText в методе afterTextChanged - person Muhammed Aydogan; 19.03.2020
comment
Я добавил таймер в решение, чтобы подождать 2 секунды после того, как пользователь закончит печатать, а затем мы преобразуем время в минуты и секунды. Я обновил код выше. - person devMohaned; 19.03.2020

Есть эта функция из DateUtils, которую вы можете использовать, вам просто нужно дать ей Long.

/**
     * Formats an elapsed time in the form "MM:SS" or "H:MM:SS"
     * for display on the call-in-progress screen.
     * @param elapsedSeconds the elapsed time in seconds.
     */
    public static String formatElapsedTime(long elapsedSeconds) {
        return formatElapsedTime(null, elapsedSeconds);
    }

использовать его очень просто, DateUtils.formatElapsedTime(time) и он напечатает в String ваше время, отформатированное MM:SS

person Biscuit    schedule 17.03.2020
comment
Спасибо, но вы не получили то, что я спросил. Я хочу динамически исправить неправильный формат ввода, например: от 65 до 59 секунд, потому что в минуту не может быть более 59 секунд. - person Muhammed Aydogan; 18.03.2020
comment
какой код вы используете для отображения отформатированной строки? Возможно, вы захотите взглянуть на: stackoverflow.com/questions/625433/ - person Biscuit; 18.03.2020