android - 尝试使用 onSaveInstanceState 和 onRestoreSaveInstanceState 来保存我的活动状态,但它不起作用
问题描述
我正在尝试制作一个测验应用程序,以便当用户单击加号按钮时,它会将他们带到他们输入问题和答案的页面,然后他们可以保存并返回到上一页,其中有一个新按钮设置为问题的文本被创建。我已经对所有这些进行了编码和工作,除了如果用户想要编辑它可以保存问题/答案活动状态的部分。我尝试使用 onSaveInstanceState 和 onRestoreSaveInstanceState 但它根本没有保存活动。有人可以看到我做错了什么吗?这是我的代码:
主要活动:
package com.example.quest
import android.app.Activity
import android.app.AlertDialog
import android.content.Intent
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.Gravity
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import com.google.android.material.floatingactionbutton.FloatingActionButton
class MainActivity : AppCompatActivity() {
private val questionActivityCode = 2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<FloatingActionButton>(R.id.btn2).setOnClickListener{
startActivityForResult(Intent(this@MainActivity, SecondActivity::class.java), questionActivityCode)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == questionActivityCode && resultCode == Activity.RESULT_OK) {
createNewButtonWithText(data?.getStringExtra("test") ?: "")
}
}
private fun createNewButtonWithText(text: String)
{
val newbutton = Button(this@MainActivity)
val layout = findViewById<LinearLayout>(R.id.mainlayout)
newbutton.text = text
newbutton.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
newbutton.width=1010
newbutton.height=300
newbutton.gravity = Gravity.CENTER
newbutton.translationX= 65F
newbutton.setTextColor(Color.parseColor("#FFFFFFFF"))
newbutton.setBackgroundColor(Color.parseColor("#250A43"))
layout.addView(newbutton)
val inflator = layoutInflater
val builder = AlertDialog.Builder(this)
val intent = Intent(this@MainActivity, SecondActivity::class.java)
newbutton.setOnClickListener{
val dialogLayout = inflator.inflate(R.layout.text, null)
with(builder) {
setTitle(newbutton.text)
setPositiveButton("Edit"){dialog, which ->
startActivity(intent)
}
setNegativeButton("Cancel"){dialog, which ->
Log.d("Main", "Negative button clicked")
}
setView(dialogLayout)
show()
}
}
}}
第二个活动:
package com.example.quest
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.EditText
import com.google.android.material.floatingactionbutton.FloatingActionButton
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
val question = findViewById<EditText>(R.id.question)
findViewById<FloatingActionButton>(R.id.btn3).setOnClickListener{
val questiontext = question.text.toString()
val returnIntent = Intent()
returnIntent.putExtra("test", questiontext)
setResult(Activity.RESULT_OK, returnIntent)
finish()
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
Log.i("Instance State", "onSaveInstanceState")
val question = findViewById<EditText>(R.id.question)
val answer = findViewById<EditText>(R.id.answer)
outState.putCharSequence("savedQuestion", question.toString())
outState.putCharSequence("savedAnswer", answer.toString())
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
Log.i("Restored Instance State", "onRestoreInstanceState")
val question = savedInstanceState.getCharSequence("savedQuestion")
val answer = savedInstanceState.getCharSequence("savedAnswer")
val txt = findViewById<EditText>(R.id.question)
val txt2 = findViewById<EditText>(R.id.answer)
txt.setText(question)
txt2.setText(answer)
}
}
解决方案
这不是onSaveInstanceState
and的用例onRestoreInstanceState
。您应该在重新创建 Activity 时使用它们。例如:设备旋转。
在您的情况下,您正在启动一个新实例,SecondActivity
当您从MainActivity
.
要实现您想要的,您应该将问题和答案从MainActivity
使用SecondActivity
a传递Bundle
,然后让用户编辑它们。
推荐阅读
- ios - 带有自定义 NSSortDescriptor 的 NSFetchedResultsController
- numpy - Numpy,过滤行使用 1,0 值的掩码?
- python - sqlite3.InterfaceError:错误绑定参数 0 - 可能是不受支持的类型。- 登录页面
- flutter - 用什么?Flutter 中的 Bloc 或 Moor
- sql - Oracle 特定排序
- php - 在刀片视图中的每次点击链接更改
- python - 如何在 Python 中重用已初始化的类?
- openedge - 将 XML 数据导入 Temp-Table in Progress 4GL/OpenEdge ABL
- php - 检查日期是否大于字符串
- c# - 在 Xamarin 自动化 UI 测试中按索引从 ListView 获取元素