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

Android开发:无法为对话框中的EditText设置SharedPreferences存储的文本

问题分析与解决方向

嘿,我碰到过类似的问题!你现在的情况是SharedPreferences里的值能通过Toast正常显示,但就是没法同步到对话框的EditText上,大概率是代码执行时机不对导致的,我给你梳理几个排查方向:

1. 最可能的原因:设置文本的时机错了!

看你的代码,etDownGame.setText(savedString)是写在showAlertDialog的点击监听器里的——这意味着只有当你点击对话框的按钮时,才会执行setText,而对话框刚弹出来的时候EditText自然是空的!

你应该把设置文本的代码移到加载完布局之后、显示对话框之前,也就是把EditText的初始化和赋值逻辑提前,修改后的代码大概是这样:

private fun showDownloadDialog() {
    val sharePreferences: SharedPreferences = getSharedPreferences("sharedPrefs", Context.MODE_PRIVATE)
    val savedString : String? = sharePreferences.getString("STRING_KEY", null)
    Toast.makeText(this, "Prefer string v3 = $savedString, length ${savedString!!.length}", Toast.LENGTH_LONG).show()
    
    val boardDownloadView = LayoutInflater.from(this).inflate(R.layout.dialog_download_board, null)
    // 在这里提前设置EditText的文本!
    val etDownGame = boardDownloadView.findViewById<EditText>(R.id.etDownloadGame)
    savedString?.let {
        etDownGame.setText(it)
    }
    
    showAlertDialog(getString(R.string.fetchMemoryGame), boardDownloadView, View.OnClickListener {
        // 这里只处理按钮点击后的逻辑,比如获取用户修改后的输入
        val inputText = etDownGame.text.toString()
        // 后续下载相关操作...
    })
}

2. 排查XML布局的小细节

你的XML里设置了android:text="",这个本身没问题,但可以暂时去掉试试,避免和代码设置的文本冲突;另外也可以检查下android:textColor是不是和背景色太接近,导致文本看不见(不过这个概率很低,毕竟Toast能正常显示)。

3. 做个稳妥的空值判断

虽然你用了savedString!!强制非空,但最好还是加个空判断,既避免空指针,也能确认值是否正常:

savedString?.let {
    etDownGame.setText(it)
} ?: run {
    Toast.makeText(this, "没有保存的游戏名称哦", Toast.LENGTH_SHORT).show()
}

总结

九成概率是设置文本的时机不对,把setText的逻辑从按钮点击事件里移到对话框布局初始化阶段,应该就能解决问题啦!

内容的提问来源于stack exchange,提问作者Eric Low

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:34:07