json файл возвращает null
Данные из json передаются следующим образом
try {
val jsonString = loadJsonFromFile(fileName, context)
val json = JSONObject(jsonString)
val jsonPages = json.getJSONArray("pages")
for (index in 0 until jsonPages.length()) {
val questionText = (index + 1).toString() + ". " + jsonPages.getJSONObject(index).getString(KEY_QUESTION_TEXT)
val answerOneText = jsonPages.getJSONObject(index).getString(KEY_ANSWER_ONE)
val answerTwoText = jsonPages.getJSONObject(index).getString(KEY_ANSWER_TWO)
val answerThreeText = jsonPages.getJSONObject(index).getString(KEY_ANSWER_THREE)
val answerFourText = jsonPages.getJSONObject(index).getString(KEY_ANSWER_FOUR)
val correctAnswerNumber = jsonPages.getJSONObject(index).getString(KEY_CORRECT_ANSWER)
pages.add(QuestionAnswerPage(questionText, answerOneText, answerTwoText, answerThreeText, answerFourText, correctAnswerNumber))
}
} catch (e: JSONException)
/
if (args != null) {
questionText.text = args.getString(PageTaker.KEY_QUESTION_TEXT)
radioOne.text = args.getString(PageTaker.KEY_ANSWER_ONE)
radioTwo.text = args.getString(PageTaker.KEY_ANSWER_TWO)
radioThree.text = args.getString(PageTaker.KEY_ANSWER_THREE)
radioFour.text = args.getString(PageTaker.KEY_ANSWER_FOUR)
correctAnswerNumber = args.getString(PageTaker.KEY_CORRECT_ANSWER)}
строка correctAnswerNumber = args.getString(PageTaker.KEY_CORRECT_ANSWER) подсвечитвается: Type mismatch. Required: String, Found: String? Получается, что переменная correctAnswerNumber будет null, хотя с остальными переменными, которым передаются значения из json файла, такого не происходит. Подскажите, в чем может быть проблема?
Сам json файл
{"pages":[{
"questionText":"Что такое преобразователь частоты?",
"answerOne": "Электротехническое устройство, предназначенное для преобразования электроэнергии промышленной амплитуды и частоты в электроэнергию с регулируемой амплитудой и частотой",
"answerTwo": "что-то",
"answerThree": "То же самое, что тиристорный преобразователь напряжения",
"answerFour": "ничего",
"correctAnswer": "1"},
{"questionText": "Вопрос 2",
"answerOne": "Неправильный ответ 1 (2)",
"answerTwo": "Неправильный ответ 2 (2)",
"answerThree": "Правильный ответ (2)",
"answerFour": "Неправильный ответ 3 (2)",
"correctAnswer": "3"},
{"questionText":"Вопрос 3",
"answerOne": "Неправильный ответ 1 (3)",
"answerTwo": "Неправильный ответ 2 (3)",
"answerThree": "Правильный ответ (3)",
"answerFour": "Неправильный ответ 3 (3)",
"correctAnswer": "3"}]}
Пробовал делать correctAnswer целочисленным, результат тот же.
newInstance():
companion object {
fun newInstance(questionAnswerPage: QuestionAnswerPage): PageFragment {
val args = Bundle()
args.putString(PageTaker.KEY_QUESTION_TEXT, questionAnswerPage.questionText)
args.putString(PageTaker.KEY_ANSWER_ONE, questionAnswerPage.answerOne)
args.putString(PageTaker.KEY_ANSWER_TWO, questionAnswerPage.answerTwo)
args.putString(PageTaker.KEY_ANSWER_THREE, questionAnswerPage.answerThree)
args.putString(PageTaker.KEY_ANSWER_FOUR, questionAnswerPage.answerFour)
args.putString(PageTaker.KEY_CORRECT_ANSWER, questionAnswerPage.correctAnswer)
val fragment = PageFragment()
fragment.arguments = args
return fragment
}
}
Ответы (2 шт):
В функции newInstance Вы кладете
args.putInt(PageTaker.KEY_CORRECT_ANSWER, questionAnswerPage.correctAnswer)
А нужно putString, раз уж у Вас String. Код смотрел в другом Вашем вопросе, добавьте в этот вопрос newInstance, пожалуйста.
P.s. Для того, чтобы показывать результат всех вопросов, Вам нужно их учитывать в коде. Я это вижу примерно так:
В activity:
const val APP_PREFERENCES = "mysettings"
const val APP_PREFS_SCORE = "my_settings_score"
private lateinit var prefs: SharedPreferences
....
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
prefs = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE)
.....
}
fun changeScore(addition: Int){
val editor = prefs.edit()
val oldValue = prefs.getInt(APP_PREFS_SCORE, 0) ?: 0
val newValue = if(oldValue + addition < 0) 0
else oldValue + addition
editor.putInt(APP_PREFS_SCORE, newValue)
editor.apply()
}
fun getScore(): Int {
return prefs.getInt(APP_PREFS_SCORE, 0) ?: 0
}
И во фрагменте:
val myActivity = requireActivity() as MyActivity //тут имя Вашего класса Activity
var score = 0
radioGroup.setOnCheckedChangeListener { _, isChecked ->
when (isChecked) {
R.id.radio_one-> when {
correctAnswerNumber == "1" -> myActivity.changeScore(1)
}
R.id.radio_two -> when {
correctAnswerNumber == "2" -> myActivity.changeScore(1)
}
R.id.radio_three -> when {
correctAnswerNumber == "3" -> myActivity.changeScore(1)
}
R.id.radio_four -> when {
correctAnswerNumber == "4" -> myActivity.changeScore(1)
}
else -> myActivity.changeScore(-1)
}
}
То есть общий счет будет сохраняться в файле настроек. Решение не самое хорошее, но простое. Для обучения - вполне сойдет.
Простите мою невнимательность. Поправил newInstance.
Теперь переменная score работает почти как надо.
var score = 0
radioGroup.setOnCheckedChangeListener { _, isChecked ->
when (isChecked) {
R.id.radio_one-> when {
correctAnswerNumber == "1" -> score++
}
R.id.radio_two -> when {
correctAnswerNumber == "2" -> score++
}
R.id.radio_three -> when {
correctAnswerNumber == "3" -> score ++
}
R.id.radio_four -> when {
correctAnswerNumber == "4" -> score++
}
else -> when {
score < 1 -> score = 0
else -> score--
}
}
}
Результат score отображается всегда для одного фрагмента. Не подскажите, как это дело поправить, чтобы выводился суммарный результат всех фрагментов? Сделать кнопку и score за рамками класса PageFragment?