Это моя цель: пользователь нажимает кнопку «минус», чтобы сумма уменьшалась на единицу, и есть оператор if, не позволяющий сумме опускаться ниже 0.

Это мой код:

   var number = 0
        view.text_amount.visibility = View.GONE

        view.plus_btn.setOnClickListener {

            if (number == 5) {
                Toast.makeText(
                    requireContext(),
                    "Limit in order",
                    Toast.LENGTH_SHORT
                ).show()
            } else {
                view.text_amount.visibility = View.VISIBLE
                number++
                view.text_amount.text = number.toString()
            }
        }
        view.minus_btn.setOnClickListener {
            if (number <= 0) {
                view.text_amount.visibility = View.GONE
            } else {
                number--
                view.text_amount.text = number.toString()

            }

        }

Есть проблема с кодом: я не хочу, чтобы сумма была видна после достижения 0. лучше впечатления, когда сумма равна 0 не видна.

Я думаю, что это простое решение, но я его не вижу. у тебя есть идеи ?

1
Bahador Eslami 31 Окт 2020 в 21:11

2 ответа

Лучший ответ

Уменьшайте значение text_amount, только если оно содержит значение больше, чем 0, и после этого проверьте его значение еще раз, и если оно равно 0, затем скройте его:

view.minus_btn.setOnClickListener {
    if (number > 0) {
        number--
        view.text_amount.text = number.toString()      
        if (number == 0) view.text_amount.visibility = View.GONE
    }
}
0
forpas 31 Окт 2020 в 18:28

Ваш код отлично работает! Если вы хотите сделать это проще, есть немного повторяющейся логики, которую вы можете сжать в одну функцию, которая обрабатывает ситуации:

fun adjustValue(amount: Int) {
    val adjusted = number + amount
    if (adjusted > 5) // show Toast
    number = adjusted.coerceIn(0, 5)
    view.text_amount.text = number.toString()
    view.text_amount.visibility = if (number == 0) View.GONE else View.VISIBLE
}

view.minus_btn.setOnClickListener { adjustValue(-1) }
view.plus_btn.setOnClickListener { adjustValue(1) }

В основном идея состоит в том, что вы определяете новое значение (я использую временную переменную, поэтому мы никогда не устанавливаем для number недопустимое значение) и показываете все необходимые предупреждения. Затем строка coerceIn гарантирует, что мы заблокируем ее в допустимом диапазоне допустимых значений.

Вы можете выполнять проверки if/else и устанавливать новое значение только в том случае, если оно действительное, но иногда проще и короче просто установить значения, а затем беспокоиться о крайних случаях, так что это всего лишь пример этого!

То же самое и с битом TextView - проще просто установить любое значение, а затем указать, должно ли оно отображаться или нет. Вы можете использовать ветки if/else, чтобы посмотреть значение и решить, устанавливать ли текст или нет ... но зачем усложнять себе жизнь? Мы знаем значение в допустимом диапазоне от 0 до 5, мы можем скрыть его, если оно равно 0, и показать в противном случае ... легко!


Вместо этого вы можете заставить функцию принимать Boolean, например plus: Boolean, а затем переходить val adjusted = number + if (plus) 1 else -1, но если вы сделаете ее Int, вы можете легко добавить кнопку +10 или что-то еще без добавление дополнительного кода или какой-либо дополнительной логики проверки, и теперь нет ничего сложнее передать -1 вместо false (возможно, это яснее!)

Это, вероятно, больше, чем вы просили, но, надеюсь, это полезно. По крайней мере, подход "просто устанавливайте текст и видимость каждый раз" хорош и удобен.

1
cactustictacs 2 Ноя 2020 в 03:45