Что делать с ошибкой android.content.res.Resources$NotFoundException: String resource ID #0x0 error?
Изначально не было ошибки, но после создания второй 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>
Источник: Stack Overflow на русском