Как убедиться, что в EditText введен только допустимый номер - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть EditText, который уже имеет inputType, равный number. Это гарантирует, что можно ввести только di git из 0-9.

    <androidx.appcompat.widget.AppCompatEditText
        android:id="@+id/uiEditTextNumber"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="36dp"
        android:inputType="number"
        android:text="0"
        android:textAlignment="center" />

Однако проблема в том, что пользователь все равно может ввести 000 или даже 0123, что не выглядит допустимым. Я также хочу таким образом, когда нет символа, он вернется к 0 (вместо пустого "")

Я ищу в Stackoverflow и обнаружил, что большинство вопросов вращаются вокруг ограничения ввода на использование android:inputType="number", но ничего не сказано о том, как избежать 00 или 0123 путем автоматического преобразования их в 0 и 123.

Я сделал нижеприведенную функцию, но, кажется, хак, где я должен вручную изменить текст и переместить курсор.

        uiEditTextNumber.doAfterTextChanged {
            if (it.isNullOrBlank()) {
                modifyText("0")
                return@doAfterTextChanged
            }
            val originalText = it.toString()
            try {
                val numberText = originalText.toInt().toString()
                if (originalText != numberText) {
                    modifyText(numberText)
                }
            } catch (e: Exception) {
                modifyText("0")
            }
        }

// ... AND the function

    private fun modifyText(numberText: String) {
        uiEditTextNumber.setText(numberText)
        uiEditTextNumber.setSelection(numberText.length)
    }

Есть ли лучшее решение?

Примечание ответ в Можно ли запретить использование первого числа в EditText как "0" не помогает, так как он просто запрещает пользователю вводить 01 и 0123, но автоматически не меняется 0 на 1, если один тип 1. Кроме того, он также не гарантирует, что в EditText ничего нет, он автоматически устанавливается на 0.

1 Ответ

0 голосов
/ 04 апреля 2020

для достижения вашей цели вы можете добавить следующую функцию

fun removeLeadingZeros(strNumber: String): String {
        for (i in strNumber.indices) {
            val c = strNumber[i]
            if (c != '0') {
                return strNumber.substring(i)
            }
        }
        //If the number consists only from zeros, return zero.
        return "0"
    }

Затем, когда вам нужно получить текст из editText, вы можете вызвать функцию следующим образом:

str = removeLeadingZeros(strNumber)
...