Что делать с ошибкой android.content.res.Resources$NotFoundException: String resource ID #0x0 error?

Рейтинг: -1Ответов: 1Опубликовано: 25.03.2023

Изначально не было ошибки, но после создания второй activity начало вылезать вот это, когда кликаешь по кнопке true:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.bignerdranch.android.geomain, PID: 6371
    android.content.res.Resources$NotFoundException: String resource ID #0x0
        at android.content.res.Resources.getText(Resources.java:348)
        at android.widget.Toast.makeText(Toast.java:307)
        at com.bignerdranch.android.geomain.MainActivity.checkAnswer(MainActivity.kt:45)
        at com.bignerdranch.android.geomain.MainActivity.onCreate$lambda$1(MainActivity.kt:100)
        at com.bignerdranch.android.geomain.MainActivity.$r8$lambda$QOLdPZ2grJX3mQx2ehXYVwQx38E(Unknown Source:0)
        at com.bignerdranch.android.geomain.MainActivity$$ExternalSyntheticLambda0.onClick(Unknown Source:2)
        at android.view.View.performClick(View.java:6597)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25885)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

MainActivity

    @file:Suppress("DEPRECATION")

package com.bignerdranch.android.geomain

import android.annotation.SuppressLint
import android.app.Activity
import android.arch.lifecycle.ViewModelProvider
import android.content.Intent

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.Gravity
import android.view.View
import android.widget.Button;
import android.widget.TextView
import android.widget.Toast



import com.bignerdranch.android.geomain.R.*
import com.bignerdranch.android.geomain.R.id.*


private const val TAG = "MainActivity"
private const val KEY_INDEX = "index"
private const val REQUEST_CODE_CHEAT = 0
class MainActivity : AppCompatActivity() {
    private lateinit var trueButton: Button
    private lateinit var falseButton: Button
    private lateinit var backButton: Button
    private lateinit var questionTextView: TextView
    private lateinit var cheatButton: Button
    private var k = 0
    private fun checkAnswer(userAnswer: Boolean) {

        val correctAnswer = quizViewModel.currentQuestionAnswer
        val messageResId = if (userAnswer == correctAnswer) {
            R.string.correct_toast
            k++

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

            val 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)
        cheatButton = findViewById(cheat_button)

        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()
            }
        }
        cheatButton.setOnClickListener {
            val answerIsTrue = quizViewModel.currentQuestionAnswer
            val intent = CheatActivity.newIntent(this@MainActivity, answerIsTrue)
            startActivityForResult(intent, REQUEST_CODE_CHEAT)

        }


        val questionTextResId = quizViewModel.currentQuestionText

        questionTextView.setText(questionTextResId)
        updateQuestion()

    }
    override fun onStart() {
        super.onStart()
        Log.d(TAG,
            "onStart() called")
    }
    override fun onResume() {
        super.onResume()
        Log.d(TAG,
            "onResume() called")
    }
    override fun onPause() {
        super.onPause()
        Log.d(TAG,
            "onPause() called")
    }
    override fun onStop() {
        super.onStop()
        Log.d(TAG,
            "onStop() called")
    }
    override fun onDestroy() {
        super.onDestroy()
        Log.d(TAG,
            "onDestroy() called")
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode,
            resultCode, data)
        if (resultCode != Activity.RESULT_OK) {
            return
        }
        if (requestCode == REQUEST_CODE_CHEAT)
        {
            quizViewModel.isCheater =
                data?.getBooleanExtra(EXTRA_ANSWER_SHOWN, false) ?: false
        }
    }


}

CheatActivity

package com.bignerdranch.android.geomain

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

private const val EXTRA_ANSWER_IS_TRUE = "com.bignerdranch.android.geoquiz.answer_is_true"
const val EXTRA_ANSWER_SHOWN = "com.bignerdranch.android.geoquiz.answer_shown"

class CheatActivity : AppCompatActivity() {
    private lateinit var answerTextView: TextView
    private lateinit var showAnswerButton: Button

    private var answerIsTrue = false
    private fun setAnswerShownResult(isAnswerShown: Boolean) {
        val data = Intent().apply {
            putExtra(EXTRA_ANSWER_SHOWN,
                isAnswerShown)
        }
        setResult(Activity.RESULT_OK, data)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_cheat)
        answerIsTrue = intent.getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false)
        answerTextView = findViewById(R.id.answer_text_view)
        showAnswerButton = findViewById(R.id.show_answer_button)
        showAnswerButton.setOnClickListener {
            val answerText = when {
                answerIsTrue ->
                    R.string.true_button
                else -> R.string.false_button
            }
            answerTextView.setText(answerText)
            setAnswerShownResult(true)

        }


    }
    companion object {
        fun newIntent(packageContext: Context,
                      answerIsTrue: Boolean): Intent {
            return Intent(packageContext,
                CheatActivity::class.java).apply {
                putExtra(EXTRA_ANSWER_IS_TRUE,
                    answerIsTrue)
                }

        }
    }

}

QuizViewModel

package com.bignerdranch.android.geomain

import android.arch.lifecycle.ViewModel
import android.util.Log

private const val TAG = "QuizViewModel"
class QuizViewModel: ViewModel() {
    var currentIndex = 0
    var isCheater = false
    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

}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:gravity="center"
    android:orientation="vertical">
    <TextView
        android:id="@+id/question_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="24dp"
        android:gravity="center"
        tools:text="@string/question_australia"
         />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/true_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/true_button"
            android:background="#FF018786"
            />

        <Button
            android:id="@+id/false_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/false_button"
            android:background="#C52D2D"
        />

        <Button
            android:id="@+id/back_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:drawablePadding="4dp"
            android:text="@string/back_button"
            android:drawableEnd="@drawable/arrow_left"
            />
        <Button
            android:id="@+id/cheat_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/cheat_button" />

    </LinearLayout>
</LinearLayout>

activity_cheat

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:gravity="center"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="24dp"
        android:text="@string/warning_text"/>
    <TextView
        android:id="@+id/answer_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="24dp"
        tools:text="Answer"/>
    <Button
        android:id="@+id/show_answer_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/show_answer_button"/>
</LinearLayout>

Strings

<resources>
    <string name="app_name">GeoQuiz</string>
    <string name="question_australia">Canberra is the capital of Australia.</string>
    <string name="correct_toast">Correct</string>
    <string name="incorrect_toast">Incorrect</string>
    <string name="true_button">True</string>
    <string name="false_button">False</string>
    <string name="back_button">Back</string>
    <string name="question_oceans">The Pacific Ocean is larger than the Atlantic Ocean.</string>
    <string name="question_mideast">The Suez Canal connects the Red Sea and the Indian Ocean.</string>
    <string name="question_africa">The source of the Nile River is in Egypt.</string>
    <string name="question_americas">The Amazon River is the longest river in the Americas.</string>
    <string name="question_asia">Lake Baikal is the world\'s oldest and deepest freshwater lake.</string>
    <string name="warning_text">Are you sure you want to do this?</string>
    <string name="show_answer_button">Show Answer</string>
    <string name="cheat_button">Cheat!</string>
    <string name="judgment_toast">Cheating is wrong.</string>

</resources>

Ответы

▲ 0Принят

Проблема в том что при присвоении значения переменной через if-else, переменная получает значение последнего выражения в блоке.
То есть в этом коде:

        val messageResId = if (userAnswer == correctAnswer) {
            R.string.correct_toast
            k++

        } else {
            R.string.incorrect_toast
        }

когда условие верно, переменной messageResId присваивается значение переменной k, а не ожидаемый идентификатор ресурса