@vladis005
Начинающий веб разработчик

Почему нужно дважды нажать кнопку чтобы вызвать действие?

По нажатию кнопок true/false нужно вывести надпись correct/incorrect и перелистнуть на следующий вопрос одновременно а по нажатию на back перелистнуть на предыдущий вопрос. До использования ViewModel все было нормально но теперь нужно дважды нажать на кнопку чтобы случилось действие. Как быть? В чем моя ошибка?
MainActivity.kt
class MainActivity : AppCompatActivity() {
    private lateinit var trueButton: Button
    private lateinit var falseButton: Button
    private lateinit var backButton: Button
    /*nextButton*/
    private lateinit var questionTextView: TextView

    private var k = 0
    private fun checkAnswer(userAnswer: Boolean) {

        val correctAnswer = quizViewModel.currentQuestionAnswer


        val messageResId = if (userAnswer == correctAnswer) {

            k+=1
            R.string.correct_toast


        } else {
            R.string.incorrect_toast
        }

        Toast.makeText(
            this, messageResId,
            Toast.LENGTH_SHORT
        ).apply { setGravity(Gravity.TOP, 0, 0) }.show()
    }
    private fun result(){

        if(quizViewModel.currentIndex==quizViewModel.f) {

            var str = "Your result is $k out of ${quizViewModel.c}"
            Toast.makeText(
                this, str,
                Toast.LENGTH_SHORT
            ).show()

        }


    }
    private val quizViewModel: QuizViewModel by lazy{
        val factory = QuizViewModelFactory()
        ViewModelProvider(this, factory).get(QuizViewModel::class.java)
    }
    @SuppressLint("MissingInflatedId")
    override fun onSaveInstanceState(savedInstanceState: Bundle) {
        super.onSaveInstanceState(savedInstanceState)
        Log.i(TAG,
            "onSaveInstanceState")
        savedInstanceState.putInt(KEY_INDEX,
            quizViewModel.currentIndex)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "onCreate(Bundle?) called")
        setContentView(R.layout.activity_main)
        Log.d(TAG, "Got a QuizViewModel:$quizViewModel")
        val currentIndex = savedInstanceState?.getInt(KEY_INDEX, 0) ?: 0
        quizViewModel.currentIndex = currentIndex
        trueButton = findViewById(true_button)
        falseButton = findViewById(false_button)
        backButton = findViewById(back_button)
        /*nextbutton*/
        fun updateQuestion() {
            val questionTextResId = quizViewModel.currentQuestionText
            questionTextView.setText(questionTextResId)
        }
        fun backQuestion(){
            val questionTextResIdBack = quizViewModel.currentQuestionText
            questionTextView.setText(questionTextResIdBack)
        }


        questionTextView = findViewById(question_text)
        trueButton.setOnClickListener { view: View ->
            checkAnswer(true)
            updateQuestion()
            quizViewModel.moveToNext()


            result()

        }
        falseButton.setOnClickListener { view: View ->
            checkAnswer(false)
            updateQuestion()
            quizViewModel.moveToNext()


            result()

        }
        backButton.setOnClickListener { view: View ->


            if(quizViewModel.currentIndex>=0){
                quizViewModel.moveToPrevious()
                backQuestion()

            }
        }

        val questionTextResId = quizViewModel.currentQuestionText

        questionTextView.setText(questionTextResId)

    }
    ...

QuizViewModel
...
private const val TAG = "QuizViewModel"
class QuizViewModel: ViewModel() {
    var currentIndex = 0
    private val questionBank = listOf(
        Question(R.string.question_australia,
            true),
        Question(R.string.question_oceans,
            true),
        Question(R.string.question_mideast,
            false),
        Question(R.string.question_africa,
            false),
        Question(R.string.question_americas,
            true),
        Question(R.string.question_asia, true)
    )
    val currentQuestionAnswer: Boolean
        get() = questionBank[currentIndex].answer
    val currentQuestionText: Int
        get() = questionBank[currentIndex].textResId
    fun moveToNext() {
        currentIndex = (currentIndex + 1) % questionBank.size
    }
    fun moveToPrevious() {
        currentIndex = (currentIndex - 1) % questionBank.size
    }
    val f = questionBank.size-1
    val c = questionBank.size

}
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ответы на вопрос 1
@5465
Проблема заключается в том, что при первом нажатии кнопки вы не вызываете метод checkAnswer(), который обновляет текущий индекс в QuizViewModel и вызывает метод result(). Поэтому при первом нажатии кнопки вы переходите на следующий вопрос, но не обновляете результат и не выводите сообщение об ответе. При втором нажатии кнопки происходит вызов метода checkAnswer(), который уже устанавливает правильный результат и вызывает result().

Для решения этой проблемы вы можете добавить вызов метода checkAnswer() внутри блоков if в обработчиках нажатия кнопок trueButton и falseButton. Также вы можете вызвать метод result() сразу после нажатия кнопки backButton для обновления результата после перехода на предыдущий вопрос.

Пример исправленного кода MainActivity.kt:

trueButton.setOnClickListener { view: View ->
    checkAnswer(true)
    quizViewModel.moveToNext()
    updateQuestion()
    result()
}

falseButton.setOnClickListener { view: View ->
    checkAnswer(false)
    quizViewModel.moveToNext()
    updateQuestion()
    result()
}

backButton.setOnClickListener { view: View ->
    if (quizViewModel.currentIndex > 0) {
        quizViewModel.moveToPrevious()
        backQuestion()
        result()
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы