Котлин, когда с несколькими исходами для каждого случая

#android #kotlin

Вопрос:

Я только начал изучать Котлин и не знаю when , как его правильно использовать. Когда число равно 1, тост есть, но изображение (второй 1 случай) не меняется. Есть ли способ сделать это с when помощью ?

 when (number){
    1 -> Toast.makeText(applicationContext,"1",Toast.LENGTH_SHORT).show()
    1 -> imgview.setImageResource(R.drawable.dice_1)
    2 -> Toast.makeText(applicationContext,"SAD",Toast.LENGTH_SHORT).show()
    2 -> imgview.setImageResource(R.drawable.dice_2) 
}
 

Ответ №1:

Конечно, просто заключите каждый набор операторов в фигурные скобки:

 when (number){
    1 -> {
        Toast.makeText(applicationContext,"1",Toast.LENGTH_SHORT).show()
        imgview.setImageResource(R.drawable.dice_1)
    }
    2 -> {
        Toast.makeText(applicationContext,"SAD",Toast.LENGTH_SHORT).show()
        imgview.setImageResource(R.drawable.dice_2) 
    }
}
 

Ответ №2:

when утверждение in Kotlin аналогично switch утверждению in Java . Как только в инструкции будет найден соответствующий регистр when , элемент управления вернется из инструкции.

Таким образом, в вашем коде выполняется первый 1 случай, и элемент управления возвращается из инструкции, поэтому он никогда не переходит ко второму 1 случаю. Я не знаю вашей цели для дублирования этих случаев вместо того, чтобы группировать их, как показано в приведенном ниже коде:

 when (number){
    1 -> { 
     Toast.makeText(applicationContext,"1",Toast.LENGTH_SHORT).show()
     imgview.setImageResource(R.drawable.dice_1)
     } 
    2 -> { 
     Toast.makeText(applicationContext,"SAD",Toast.LENGTH_SHORT).show()     
     imgview.setImageResource(R.drawable.dice_2)
     } 
}
 

Ответ №3:

     when (number){
        1 -> { 
        Toast.makeText(applicationContext,"1",Toast.LENGTH_SHORT).show()
        imgview.setImageResource(R.drawable.dice_1)}
        2 ->{ Toast.makeText(applicationContext,"SAD",Toast.LENGTH_SHORT).show()
        imgview.setImageResource(R.drawable.dice_2) }
       else->{
       //if both fail to mach
          }
}
 

Добавьте фигурные скобки для определения области действия.

Ответ №4:

when ищет первое условие, которое соответствует, поэтому, как только вы попадете в первую 1 ветвь, он выполнит код, а затем выйдет из блока. Это не доходит до других — вы можете думать об этом как о большом if/else if/else if/else блоке, где более поздние могут сработать только в том случае, если ничего не произошло до них.

Поэтому вам нужно выполнить весь свой код в первой ветке, которая соответствует, как показано в других ответах!