Search code examples
androidkotlinandroid-toast

Toast isn't showing up


Trying to show two Toasts with some info, but one of them isn't showing up.

The points of interest in the code below are functions showScore() and checkAnswer(). The first one doesn't show up its Toast, the second one does. The project builds successfully and the app is working on my phone (Android 9, aarch64).

I just started learning Android. Maybe it's something stupid simple, but I can't get the reason why it's not working.

class MainActivity : AppCompatActivity() {

    private lateinit var trueButton: Button
    private lateinit var falseButton: Button
    private lateinit var nextButton: ImageButton
    private lateinit var prevButton: ImageButton
    private lateinit var questionTextView: TextView

    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)
    )

    private val answers = mutableMapOf<Question, Boolean>()

    private var currentIndex = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        trueButton = findViewById(R.id.true_button)
        falseButton = findViewById(R.id.false_button)
        nextButton = findViewById(R.id.next_button)
        prevButton = findViewById(R.id.prev_button)
        questionTextView = findViewById(R.id.question_text_view)

        trueButton.setOnClickListener { view: View ->
            checkAnswer(true)
        }

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

        nextButton.setOnClickListener {
            currentIndex = (currentIndex + 1) % questionBank.size
            updateQuestion()
            checkIfAnswered()
        }

        prevButton.setOnClickListener {
            currentIndex = if (currentIndex > 0) (currentIndex - 1) else (questionBank.size - 1)
            updateQuestion()
            checkIfAnswered()
        }

        questionTextView.setOnClickListener {
            currentIndex = (currentIndex + 1) % questionBank.size
            updateQuestion()
            checkIfAnswered()
        }

        updateQuestion()
    }

    private fun updateQuestion() {
        val questionTextResId = questionBank[currentIndex].textResId
        questionTextView.setText(questionTextResId)
    }

    private fun checkAnswer(userAnswer: Boolean) {
        val question = questionBank[currentIndex]
        val correctAnswer = question.answer

        if (!answers.containsKey(question)) {
            answers[question] = userAnswer
            falseButton.isEnabled = false
            trueButton.isEnabled = false

            if (answers.size == questionBank.size) {
                showScore()
            }
        } else {
            return
        }

        val messageResId = if (userAnswer == correctAnswer) {
            R.string.correct_toast
        } else {
            R.string.incorrect_toast
        }

        Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show()
    }

    private fun checkIfAnswered() {
        if (answers.containsKey(questionBank[currentIndex])) {
            falseButton.isEnabled = false
            trueButton.isEnabled = false
        } else {
            falseButton.isEnabled = true
            trueButton.isEnabled = true
        }
    }

    private fun showScore() {
        var score = 0
        answers.forEach {
            if (it.key.answer == it.value) {
                score += 1
            }
        }
        val toastText = "You answered $score of ${questionBank.size}"
        Toast.makeText(this, toastText, Toast.LENGTH_SHORT).show()
    }
}

UDP: Tried to run on my friend's phone (Android 9, aarch64) and faced the same issue.


Solution

  • Thanks to one Android-related chat, I found the problem. The problem is that one Toast appears on top of another one. Generally, it's a bad idea to use Toasts this way. If you have a similar problem, consider using Snackbar.