Есть ли способ избежать повторения с помощью проверки TextInputEditText? - PullRequest
0 голосов
/ 10 февраля 2020

Во фрагменте есть 5 полей TextInputEditText. Первый - строка, а остальные 4 - двойные, которые пользователь должен ввести. Чтобы убедиться, что значения действительны, каждое поле проверяется на пустоту, а последние четыре (с двойными) проверяются, если значение является двойным.

В следующем фрагменте кода я обрезал последние 2 декларации val & fun, поскольку они точно такие же, как и последние 2 oes, за исключением имен TextInPutLayout (и соответствующего val).

Итак, мне было интересно, возможно ли сделать pu sh короче в любым способом

private val enterTextFoodName = view.findViewById<TextInputLayout>(R.id.enter_food_name)
private val enterTextKcal = view.findViewById<TextInputLayout>(R.id.enter_kcal)
private val enterTextCarbs = view.findViewById<TextInputLayout>(R.id.enter_carbs)
[...]

    private fun validateValues(): Boolean {
        return (!validateFoodName()
                || !validateKcal()
                || !validateCarbs()
                [...])
    }

    private fun validateFoodName(): Boolean {
        return when {
            enterTextFoodName.editText?.text.toString().trim().isEmpty() -> {
                enterTextFoodName.error = getString(R.string.cant_be_empty)
                false
            }
            else -> {
                enterTextFoodName.error = null
                true
            }
        }
    }

    private fun validateKcal(): Boolean {
        return when {
            enterTextKcal.editText?.text.toString().trim().isEmpty() -> {
                enterTextKcal.error = getString(R.string.cant_be_empty)
                false
        }
            enterTextKcal.editText?.text.toString().trim().toDoubleOrNull() == null -> {
                enterTextKcal.error = getString(R.string.invalid_value)
                false
            }
            else -> {
                enterTextKcal.error = null
                true
            }
        }
    }

    private fun validateCarbs(): Boolean {
        return when {
            enterTextCarbs.editText?.text.toString().trim().isEmpty() -> {
                enterTextCarbs.error = getString(R.string.cant_be_empty)
                false
            }
            enterTextCarbs.editText?.text.toString().trim().toDoubleOrNull() == null -> {
                enterTextCarbs.error = getString(R.string.invalid_value)
                false
            }
            else -> {
                enterTextCarbs.error = null
                true
            }
        }
    }

[...]

1 Ответ

1 голос
/ 10 февраля 2020

Вы можете добиться этого с помощью функции расширения в Kotlin:

inline fun TextInputLayout.validateInput(messageInvalid: String? = null, checkIfValid: (String?) -> Boolean): Boolean {
    val inputText = editText?.text?.toString()?.trim()
    when {
        inputText.isNullOrEmpty() -> {
            error = context.getString(R.string.cant_be_empty)
        }

        !checkIfValid(inputText) -> {
            error = messageInvalid
        }

        else -> {
            error = null
            return true
        }
    }
    return false
}

Тогда вы можете использовать это так:

val isCarbsValid = enterTextCarbs.validateInput(getString(R.string.invalid_value)) { it?.toDoubleOrNull() != null }
...