为什么sharedPreferences在Android(Kotlin)中不起作用

ifsvaxew  于 2023-08-06  发布在  Kotlin
关注(0)|答案(2)|浏览(154)

我在xml文件中使用了一个edittext,我想在用户写一个文本并onResume或onDestroy程序或使用共享首选项功能关闭同一程序时,将文本保存在edittext中,但不幸的是程序崩溃并关闭
MainActivity.kt:

class MainActivity : AppCompatActivity() {
    private lateinit var editText: EditText
    private val name = "MY_TEXT"
    private val key = "myStoreData"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        editText = findViewById(R.id.edittext)
    }
    override fun onResume() {
        super.onResume()
        var sharedPreferences: SharedPreferences = getSharedPreferences(name, MODE_PRIVATE)
        val myValue = sharedPreferences.getString(key,"")
        editText.setText(myValue)
    }
    override fun onDestroy() {
        super.onDestroy()
        var sharedPreferences: SharedPreferences = getSharedPreferences(name, MODE_PRIVATE)
        var edit = sharedPreferences.edit()
        edit.putString("my Store Data",editText.text.toString())
        edit.apply()
    }
}

字符串
Activity_main.xml:

<EditText
        android:id="@+id/editTextText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="text"
        android:minHeight="48dp"
        android:text="text"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="Autofill,HardcodedText,LabelFor" />


我想程序保存文本,但程序崩溃

wj8zmpe1

wj8zmpe11#

根据提供的代码和XML布局,我可以看到可能导致崩溃的几个问题:

**1. XML布局问题:**在您的XML布局中,EditText的ID设置为editTextText,但在您的MainActivity.kt文件中,您试图使用ID edittext查找EditText。您需要使用在XML布局中用于查找EditText的相同ID。如下所示更新onCreate方法:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    editText = findViewById(R.id.editTextText) // Use the correct ID here
}

字符串

**2. SharedPreferences的Key不正确:**在onDestroy方法中,将文本保存到SharedPreferences时使用的键与在onResume方法中检索数据时使用的键不同。更新onDestroy方法中的键以匹配onResume中使用的键:

override fun onDestroy() {
    super.onDestroy()
    var sharedPreferences: SharedPreferences = getSharedPreferences(name, MODE_PRIVATE)
    var edit = sharedPreferences.edit()
    edit.putString(key, editText.text.toString()) // Use the same key here
    edit.apply()
}


在进行这些更改之后,代码应按预期工作,并保存在EditText中输入的文本。

osh3o9ms

osh3o9ms2#

出现崩溃是因为XML中定义的editText的ID与您在Activity中使用的ID不同。
而不是这样做:

editText = findViewById(R.id.edittext)

字符串
这样做:

editText = findViewById(R.id.editTextText)


并替换:

edit.putString("my Store Data",editText.text.toString())


edit.putString(key or "myStoreData",editText.text.toString())


希望这能帮上忙。

相关问题