Как сохранить данные, переданные из другого действия в Kotlin? - PullRequest
0 голосов
/ 15 апреля 2020

Я использовал intent для передачи student name от начальной активности StudentNameInput к StudentInitialActivity. Второе действие отображает любое имя, введенное пользователем в предыдущем действии. Мой код правильно отображает имя, как только пользователь входит в систему. Однако, когда я закрываю приложение, имя отображается как null. У меня вопрос, как мне продолжать отображать имя даже после закрытия и перезапуска приложения. Я уже реализовал shared 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))
        }
    }
}

1 Ответ

0 голосов
/ 15 апреля 2020

Поскольку вы уже сохранили имя пользователя в действии StudentNameInput и написали там условие, чтобы проверить, принимает ли уже сохраненное имя непосредственно к StudentInitialActivity. Так что вы не можете получить сохраненное имя, я предложу вам это решение -

В StudentNameInput добавьте имя пользователя для намерения в этом блоке

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