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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:06:12