Android Kotlin实现按星期+时段自动加载Drawable对应图片
解决方案
要实现按星期+时段加载对应背景图,核心是动态拼接资源名称并通过资源ID获取方法加载,具体实现如下:
1. 核心函数实现
// 提前定义星期与资源名称前缀的映射,避免本地化导致的名称不一致 private val dayToResourcePrefix = mapOf( DayOfWeek.MONDAY to "monday", DayOfWeek.TUESDAY to "tuesday", DayOfWeek.WEDNESDAY to "wednesday", DayOfWeek.THURSDAY to "thursday", DayOfWeek.FRIDAY to "friday", DayOfWeek.SATURDAY to "saturday", DayOfWeek.SUNDAY to "sunday" ) private fun getBackgroundResId(context: Context, date: LocalDate, time: LocalTime): Int { // 1. 获取当前星期对应的资源前缀 val dayPrefix = dayToResourcePrefix[date.dayOfWeek] ?: "monday" // 兜底默认周一前缀 // 2. 根据时段确定昼夜后缀 val timeSuffix = if (time.hour in 6..18) "imageday" else "imagenight" // 3. 拼接完整资源名称(如tuesday_imageday) val resourceName = "${dayPrefix}_$timeSuffix" // 4. 通过资源名称动态获取Drawable ID val resId = context.resources.getIdentifier( resourceName, "drawable", context.packageName ) // 5. 资源不存在时 fallback 到原有默认昼夜图,避免崩溃 return resId.takeIf { it != 0 } ?: run { if (time.hour in 6..18) R.drawable.imageday else R.drawable.imagenight } }
2. 调用示例
获取当前日期时间并加载对应背景:
val currentDate = LocalDate.now() val currentTime = LocalTime.now() val backgroundResId = getBackgroundResId(this, currentDate, currentTime) // 示例:给ImageView设置背景 yourImageView.setImageResource(backgroundResId)
关键说明
- 星期映射:手动定义星期与资源前缀的对应关系,避免系统本地化(如非英文系统)导致的DayOfWeek名称异常。
- 动态资源获取:
getIdentifier通过资源名、类型、包名获取资源ID,是实现动态加载的核心。 - 异常兜底:当拼接的资源不存在时(如拼写错误),自动 fallback 到原有默认昼夜图,防止崩溃。
- 资源命名规范:确保Drawable目录下的图片名称完全匹配拼接格式(全小写、下划线分隔,如
tuesday_imagenight.png)。
内容的提问来源于stack exchange,提问作者TopaZ
相关产品推荐
相关产品推荐

