为什么我的 savedInstanceState 不工作?
Why my savedInstanceState is not working?
我是 android 使用 kotlin 的工作室的新手。
我想制作多项选择题应用程序,我使用数据 class 和对象常量来提供问题。如果用户选择正确,private var mCurrentPosition(Int) 会加 1,setQuestion() 会改变问题、选择和 correctChoice。
为了防止app关闭后进度被重置,我想把mCurrentPosition的int存起来就好了,所以用了onSaveIntanceState。但是在应用程序关闭后会初始化进度...
class QuizActivity : AppCompatActivity() {
private var mCurrentPosition: Int = 1
private var mQuestion300List: ArrayList<Question300>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if(savedInstanceState != null) {
with(savedInstanceState) {
mCurrentPosition = getInt(STATE_SCORE)
}
} else {
mCurrentPosition = 1
}
setContentView(R.layout.activity_quiz)
val questionList = Constant.getQuestions()
Log.i("Question Size", "${questionList.size}")
mQuestion300List = Constant.getQuestions()
setQuestion()
tv_choice1.setOnClickListener {
if (tv_correctChoice.text.toString() == "1") {
mCurrentPosition ++
setQuestion()
} else {
tv_choice1.setBackgroundResource(R.drawable.shape_wrongchoice)
}
}
tv_choice2.setOnClickListener {
if (tv_correctChoice.text.toString() == "2") {
mCurrentPosition ++
setQuestion()
} else {
tv_choice2.setBackgroundResource(R.drawable.shape_wrongchoice)
}
}
tv_choice3.setOnClickListener {
if (tv_correctChoice.text.toString() == "3") {
mCurrentPosition ++
setQuestion()
} else {
tv_choice3.setBackgroundResource(R.drawable.shape_wrongchoice)
}
}
}
override fun onSaveInstanceState(outState: Bundle) {
outState?.run {
putInt(STATE_SCORE, mCurrentPosition)
}
super.onSaveInstanceState(outState)
}
companion object {
val STATE_SCORE = "score"
}
private fun setQuestion() {
val question300 = mQuestion300List!![mCurrentPosition-1]
tv_question.text = question300!!.question
tv_choice1.text = question300.choice1
tv_choice2.text = question300.choice2
tv_choice3.text = question300.choice3
tv_correctChoice.text = question300.correctChoice
tv_now.setText("${mCurrentPosition}")
tv_choice1.setBackgroundResource(R.drawable.shape_problem)
tv_choice2.setBackgroundResource(R.drawable.shape_problem)
tv_choice3.setBackgroundResource(R.drawable.shape_problem)
}
}
这是我的应用程序代码。请给我帮助:) 谢谢
savedInstanceState
实际上只意味着两件事
- 幸存的旋转,其中
Activity
被摧毁并重新创建
- 系统在后台终止您的应用程序 - 所以当您 return 时,
Activity
需要按原样重新创建,因此用户看不到应用程序之间的任何区别处于后台,应用程序被杀死以节省资源
当 onCreate
运行时,如果 Activity
是从以前的状态重新创建的,您将获得一个作为 savedInstanceState
传入的包 - 这包含您添加的所有内容在 onSaveInstanceState
之前应用程序被提前停止。 但是,如果用户关闭了应用程序(通过使用后退按钮退出,或者在任务切换器中将应用程序滑开等),那么这将被视为 重新开始,没有状态 可以恢复。并且 savedInstanceState
在 onCreate
中将为空(这是您可以检查它是否是一个新开始的一种方式)。
因此,如果您希望在用户明确关闭应用程序后仍保持状态,则需要使用其他方法。 Here's the docs on the subject - the typical way is to use SharedPreferences
for small data, some kind of database like Room for larger state. DataStore
是新事物,如果您想尝试一下
我是 android 使用 kotlin 的工作室的新手。
我想制作多项选择题应用程序,我使用数据 class 和对象常量来提供问题。如果用户选择正确,private var mCurrentPosition(Int) 会加 1,setQuestion() 会改变问题、选择和 correctChoice。
为了防止app关闭后进度被重置,我想把mCurrentPosition的int存起来就好了,所以用了onSaveIntanceState。但是在应用程序关闭后会初始化进度...
class QuizActivity : AppCompatActivity() {
private var mCurrentPosition: Int = 1
private var mQuestion300List: ArrayList<Question300>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if(savedInstanceState != null) {
with(savedInstanceState) {
mCurrentPosition = getInt(STATE_SCORE)
}
} else {
mCurrentPosition = 1
}
setContentView(R.layout.activity_quiz)
val questionList = Constant.getQuestions()
Log.i("Question Size", "${questionList.size}")
mQuestion300List = Constant.getQuestions()
setQuestion()
tv_choice1.setOnClickListener {
if (tv_correctChoice.text.toString() == "1") {
mCurrentPosition ++
setQuestion()
} else {
tv_choice1.setBackgroundResource(R.drawable.shape_wrongchoice)
}
}
tv_choice2.setOnClickListener {
if (tv_correctChoice.text.toString() == "2") {
mCurrentPosition ++
setQuestion()
} else {
tv_choice2.setBackgroundResource(R.drawable.shape_wrongchoice)
}
}
tv_choice3.setOnClickListener {
if (tv_correctChoice.text.toString() == "3") {
mCurrentPosition ++
setQuestion()
} else {
tv_choice3.setBackgroundResource(R.drawable.shape_wrongchoice)
}
}
}
override fun onSaveInstanceState(outState: Bundle) {
outState?.run {
putInt(STATE_SCORE, mCurrentPosition)
}
super.onSaveInstanceState(outState)
}
companion object {
val STATE_SCORE = "score"
}
private fun setQuestion() {
val question300 = mQuestion300List!![mCurrentPosition-1]
tv_question.text = question300!!.question
tv_choice1.text = question300.choice1
tv_choice2.text = question300.choice2
tv_choice3.text = question300.choice3
tv_correctChoice.text = question300.correctChoice
tv_now.setText("${mCurrentPosition}")
tv_choice1.setBackgroundResource(R.drawable.shape_problem)
tv_choice2.setBackgroundResource(R.drawable.shape_problem)
tv_choice3.setBackgroundResource(R.drawable.shape_problem)
}
}
这是我的应用程序代码。请给我帮助:) 谢谢
savedInstanceState
实际上只意味着两件事
- 幸存的旋转,其中
Activity
被摧毁并重新创建 - 系统在后台终止您的应用程序 - 所以当您 return 时,
Activity
需要按原样重新创建,因此用户看不到应用程序之间的任何区别处于后台,应用程序被杀死以节省资源
当 onCreate
运行时,如果 Activity
是从以前的状态重新创建的,您将获得一个作为 savedInstanceState
传入的包 - 这包含您添加的所有内容在 onSaveInstanceState
之前应用程序被提前停止。 但是,如果用户关闭了应用程序(通过使用后退按钮退出,或者在任务切换器中将应用程序滑开等),那么这将被视为 重新开始,没有状态 可以恢复。并且 savedInstanceState
在 onCreate
中将为空(这是您可以检查它是否是一个新开始的一种方式)。
因此,如果您希望在用户明确关闭应用程序后仍保持状态,则需要使用其他方法。 Here's the docs on the subject - the typical way is to use SharedPreferences
for small data, some kind of database like Room for larger state. DataStore
是新事物,如果您想尝试一下