Android中ImageView不更新/SharedPreferences未生效问题排查
问题:每日更换图片功能无法更新ImageView显示
问题描述
通过Receiver每24小时触发更换图片逻辑,修改SharedPreferences中存储的图片资源ID,通知能正常触发说明Receiver工作正常。但启动Activity时,ImageView始终显示默认的“出错”图片,日志无崩溃信息。
相关代码
Receiver代码
val quotes = arrayOf(R.drawable.i1, R.drawable.i2, R.drawable.i3, R.drawable.i5, R.drawable.i6, R.drawable.i7, R.drawable.i8, R.drawable.i9, R.drawable.i10, R.drawable.i11, R.drawable.i12, R.drawable.i13, R.drawable.i14, R.drawable.i15, R.drawable.i16, R.drawable.i17, R.drawable.i18, R.drawable.i19, R.drawable.i20, R.drawable.i21, R.drawable.i22, R.drawable.i23, R.drawable.i24, R.drawable.i25) val quote = quotes.random() val prefquotes = context.getSharedPreferences("save", AppCompatActivity.MODE_PRIVATE).edit() prefquotes.putInt("Quotes", quote) prefquotes.apply()
Qinsperation页面代码
val quote = sharedPreferences.getInt("Quote", 0) setContentView(R.layout.qinsperational) val imageView = findViewById<ImageView>(R.id.daily_image) if (quote == 0) { imageView.setImageResource(R.drawable.oh_no) }else{ Log.d("Quote", "good") imageView.setImageResource(quote) }
问题原因
SharedPreferences的键名不匹配:Receiver中存储数据用的键是"Quotes"(带s的复数形式),但Activity读取数据时用的键是"Quote"(不带s的单数形式),导致读取到的始终是默认值0,所以ImageView一直显示出错图片。
修复方案
只需统一两边的键名即可,二选一:
- 修改Receiver中的键名:
prefquotes.putInt("Quote", quote) // 将"Quotes"改为"Quote"
- 或者修改Activity中的键名:
val quote = sharedPreferences.getInt("Quotes", 0) // 将"Quote"改为"Quotes"
优化建议
为了避免后续再出现这类拼写错误,建议定义一个常量来存储键名,比如在全局类或对应文件中:
const val KEY_DAILY_IMAGE = "daily_image"
然后Receiver和Activity中都使用这个常量来读写SharedPreferences:
// Receiver中存储 prefquotes.putInt(KEY_DAILY_IMAGE, quote) // Activity中读取 val quote = sharedPreferences.getInt(KEY_DAILY_IMAGE, 0)
内容的提问来源于stack exchange,提问作者Joshu
相关产品推荐
相关产品推荐

