如何实现EditText为空时不覆盖SharedPreferences原有数据?
要实现各字段单独保存、不覆盖已有数据的需求,只需要修改saveData()方法,针对每个输入框的内容做非空判断,仅当输入内容不为空时才更新对应的SharedPreferences键值即可。开关状态因为本身有明确的选中/未选中状态,所以保持每次都保存。
修改后的saveData()方法
private fun saveData() { val usernameText = et_username.text.toString().trim() val ipText = et_ipaddress.text.toString().trim() // 仅当输入非空时更新对应UI显示 if (usernameText.isNotEmpty()) { tv_username.text = usernameText } if (ipText.isNotEmpty()) { tv_ipaddress.text = ipText } val sharedPreferences = getSharedPreferences("sharedPrefs", MODE_PRIVATE) val editor = sharedPreferences.edit() // 仅保存非空的用户名,空则不修改已有数据 if (usernameText.isNotEmpty()) { editor.putString("USERNAME_KEY", usernameText) } // 仅保存非空的IP地址,空则不修改已有数据 if (ipText.isNotEmpty()) { editor.putString("IP_KEY", ipText) } // 开关状态始终保存(因为开关本身有明确的选中/未选中状态) editor.putBoolean("SWITCH1_KEY", switch1.isChecked) editor.apply() Toast.makeText(this, "Data saved! :)", Toast.LENGTH_SHORT).show() }
完整的MainActivity.kt代码
package com.example.testapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) loadData() bt_button.setOnClickListener { saveData() } } private fun saveData() { val usernameText = et_username.text.toString().trim() val ipText = et_ipaddress.text.toString().trim() // 仅当输入非空时更新对应UI显示 if (usernameText.isNotEmpty()) { tv_username.text = usernameText } if (ipText.isNotEmpty()) { tv_ipaddress.text = ipText } val sharedPreferences = getSharedPreferences("sharedPrefs", MODE_PRIVATE) val editor = sharedPreferences.edit() // 仅保存非空的用户名,空则不修改已有数据 if (usernameText.isNotEmpty()) { editor.putString("USERNAME_KEY", usernameText) } // 仅保存非空的IP地址,空则不修改已有数据 if (ipText.isNotEmpty()) { editor.putString("IP_KEY", ipText) } // 开关状态始终保存(因为开关本身有明确的选中/未选中状态) editor.putBoolean("SWITCH1_KEY", switch1.isChecked) editor.apply() Toast.makeText(this, "Data saved! :)", Toast.LENGTH_SHORT).show() } private fun loadData() { val sharedPreferences = getSharedPreferences("sharedPrefs", MODE_PRIVATE) val savedUsername = sharedPreferences.getString("USERNAME_KEY", null) val savedIp = sharedPreferences.getString("IP_KEY", null) val savedBoolean = sharedPreferences.getBoolean("SWITCH1_KEY", false) tv_username.text = savedUsername tv_ipaddress.text = savedIp switch1.isChecked = savedBoolean } }
关键说明
- 用
trim()处理输入内容,避免用户输入的空格被当作有效内容 - 输入为空时不执行对应的
putString操作,SharedPreferences中已有的数据会被保留 - UI更新也只针对非空输入,避免清空原本显示的已有数据
内容的提问来源于stack exchange,提问作者Dillion Cixx
相关产品推荐
相关产品推荐

