Kotlin почему цикл выполняется всего один раз?
package com.example.testapp
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun test(view: View) {
var num = 0
for (i in 0..4)
num++
val testSay = Toast.makeText(this, num.toString(), Toast.LENGTH_SHORT)
testSay.show()
}
}
Почему цикл for не выполняется при каждом срабатывании onClick()? Получается всегда один и тот же тост, который равен 6
Ответы (3 шт):
Ну так оберните цикл в скобки фигурные=) у вас в теле цикла только num++
У вас же даже отступ намекает, что то что ниже num++ за пределами for
не совсем понятно почему 6.
При вызове метода цикл отрабатывает и num должен быть равен 5.
Если вы хотите чтобы num сохранял свое предыдущее значение и увеличивался каждый раз при вызове метода, то можно сделать так через Shared Preferences:
SharedPreferences sharedPreferences = getSharedPreferences("MySharedPref", MODE_PRIVATE);
var num = sharedPreferences.getInt("counter", 0);
val testSay = Toast.makeText(this, num.toString(), Toast.LENGTH_SHORT)
testSay.show()
SharedPreferences.Editor myEdit = sharedPreferences.edit();
myEdit.putInt("counter", num+1);
Попробовал Ваш код в реальности. Несколько выводов:
- Цикл выполняется каждый раз при вызове функции
fun test(view: View). - Ваш опубликованный в вопросе код показывает "5" а не "6", вероятно Вы не точно перенесли условия в вопрос.
- Показывается
toastтолько 1 раз потому что он стоит после цикла. И выполняется после того как цикл закончился и проинкрементировалnumдо 5.
Если хотите что бы тост показывал при каждом витке цыкла, то есть 5 раз, то нужно его поместить в сколуп цикла. Пример ниже:
fun test(view: View) {
var num = 0
for (i in 0..4){
num++
val testSay = Toast.makeText(this, num.toString(), Toast.LENGTH_SHORT)
testSay.show()
}
}
Отсутствие фигурных скобок возлагает на Вас ответственность помнить о том, что если Вы не оборачиваете тело метода в фигурные скобки, то метод (в данном случае for (i in 0..4)) выполнит только следующу за ним строчку. А вот Toast в данном случае уже будет вне его ответственности, потому то он выполняется только один раз в порядке очереди при вызове родительского метода fun test(view: View).