尝试使用 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)
    }
}

解决方法

这不是 onSaveInstanceStateonRestoreInstanceState 的用例。您应该在重新创建 Activity 时使用它们。例如:设备旋转。

就您而言,当您从 SecondActivity 启动时,您正在启动 MainActivity 的新实例。

要实现您想要的效果,您应该使用 MainActivity 将问题和答案从 SecondActivity 传递到 Bundle,然后让用户对其进行编辑。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...