You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现EditText为空时不覆盖SharedPreferences原有数据?

实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:35:25