我需要一个图像视图在我的android应用程序每天改变,目前我正在使用onreceive类,每24小时运行一次(利用闹钟管理器)。这将触发一个随机值(图像)被选中,然后将活动中的图像设置为先前选择的图像(使用setImageResource)。然而,它不起作用,图像视图保持空白,没有图像集。
这是接收代码-
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context,"This toast will be shown every X minutes", Toast.LENGTH_LONG).show()
if (context !is Qinperation) return
val imageView = context.findViewById<View>(R.id.paininass) as ImageView
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)
val quote = quotes.random()
imageView.setImageResource(quote)
}
}
有什么想法或建议吗?我不知道哪里出了问题,因为没有错误,它就是不工作。
findViewById
在View
s(和Activities
)上工作,你不能只在Context
上调用它-它们没有视图层次结构。即使可以,将图像设置在ImageView
上也只会影响该对象。如果你打开应用程序,另一个ImageView
是膨胀的,它将拥有XML中设置的任何图像或其他东西,这是你指定的默认值。
如果你想"记住"像这样的东西,你需要存储那个数据,然后在设置视图时读取它,并显式地告诉它们显示那个数据。最简单的方法是使用SharedPreferences
:
// or use a separate prefs file if you want - see the SharedPreferences docs
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
with(prefs.edit()) {
// since resource IDs are just ints, store as one
putInt("image res ID", quote)
apply()
}
然后在Activity
或者其他地方
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
val quote = prefs.getInt("image res ID", R.drawable.some_default)
imageView.setImageResource(quote)
"image res ID"
键应该是两个类都能看到的顶级const val
键,这样你就不会在两个地方都重复输入字符串了。
你也不需要在接收器或其他东西上乱来-当你的应用程序没有打开时,这个真的需要运行吗?或者你可以在应用程序打开时做?像这样存储当前的图像ID,并存储下一次更改发生的时间戳。当Activity打开时,查看时间戳是否已经通过——如果是,选择一个新的随机图像并存储它,并为下一次刷新更新时间戳。否则,只需使用存储的图像
如果你在onResume
或其他地方这样做,如果有必要,你可以在用户离开你的应用程序(或它的一部分)时更新它。你甚至可以使用协同程序或其他东西来安排午夜时分的图像更改,而应用程序正在使用中。你可以用广播接收器来做到这一点,但是要访问正在运行的Activity要做更多的工作——在Activity本身(或在它托管的东西中,如Fragment
s和ViewModel
s)中完成这一切更容易