首页 > 解决方案 > 如何保存从 Kotlin 中另一个活动传递的数据?

问题描述

我曾经将初始活动intent传递给活动。第二个活动显示用户在前一个活动中输入的任何名称。用户登录后,我的代码会正确显示名称。但是,当我关闭应用程序时,名称显示为. 我的问题是如何在关闭并重新启动应用程序后继续显示名称。我已经在我的代码中实现了跟踪初始启动,因此,每次打开应用程序时,应用程序都不会提示输入名称。student nameStudentNameInputStudentInitialActivitynullshared preferences

StudentNameInput活动:

class StudentNameInput : AppCompatActivity(), View.OnClickListener {

    private lateinit var sharedPref: SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        sharedPref = getSharedPreferences("YOUR_PREF_NAME", Context.MODE_PRIVATE)

        if (wasUserNameSaved()) {
            val intent = Intent(this, StudentInitialActivity::class.java)
            startActivity(intent)
            finish()
            return
        }
        setContentView(R.layout.activity_student_name_input)

        btnStudentLogIn.setOnClickListener(this)
    }

    private fun validate(): Boolean {
        if (txt_student_name.text.toString().isEmpty()) {
            txt_student_name.error = "Name cannot be empty"
            return false
        }

        return true
    }

    override fun onClick(v: View?) {
        val editTextStudentName = findViewById<EditText>(R.id.txt_student_name);
        when (v?.id) {
            R.id.btnStudentLogIn -> {
                if (validate()) {
                    Log.i(null, "setOnClickListener")
                    sharedPref.edit().putString("user_name", txt_student_name.text.toString())
                        .apply()

                    val studentName = editTextStudentName.text.toString();
                    val intent = Intent(this@StudentNameInput, StudentInitialActivity::class.java)
                    intent.putExtra("Name", studentName);
                    startActivity(intent)
                }
            }
        }
    }

    private fun wasUserNameSaved(): Boolean {
        return sharedPref.getString("user_name", "").isNotEmpty()
    }
}

StudentInitialActivity活动:

 class StudentInitialActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_student_initial)

        val intent = intent
        val name = intent.getStringExtra("Name")


        val studentNameTextView = findViewById<TextView>(R.id.textViewStudentName)

        textViewStudentName.text = "Logged in as: " + name

        btnScanForClasses.setOnClickListener {
            Log.i(null, "setOnClickListener")
            val intent = Intent(this, DeviceScanActivity::class.java)
            startActivity(intent)
        }
        btnRecords.setOnClickListener {
            startActivity(Intent(this, StudentRecords::class.java))
        }
    }
}

标签: androidkotlinandroid-intentandroid-activity

解决方案


由于您已经将用户名存储在 StudentNameInput 活动中,并且您在那里编写了一个条件来检查是否已经存储的名称直接用于 StudentInitialActivity。因此,您缺少获取存储名称的信息,我会建议您使用此解决方案-

在 StudentNameInput 中,将用户名添加到此块中的意图

if (wasUserNameSaved()){
   val intent = Intent(this, StudentInitialActivity::class.java)
                    intent.putExtra("Name", sharedPref.getString("YOUR_PREF_NAME", ""))
                    startActivity(intent)
                    finish()
                    return
                }

推荐阅读