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
相关产品推荐
相关产品推荐

