Android Plurals正确用法及分钟复数适配问题求助
解决Android Plurals类型不匹配问题
核心问题分析
调用getQuantityString时要求传入int类型的数量参数,如果变量被推断为Any,说明代码未正确约束数值类型,导致类型不匹配报错。
步骤1:确认Plurals资源配置
确保res/values/strings.xml中的复数配置正确:
<plurals name="minute"> <item quantity="one">%d minute</item> <item quantity="other">%d minutes</item> </plurals> <plurals name="hour"> <item quantity="one">%d hour</item> <item quantity="other">%d hours</item> </plurals>
步骤2:修正方法中的类型处理(Kotlin示例)
先定义枚举类:
enum class TimeType { MINUTES, HOURS }
编写格式化方法,严格约束数值为Int类型:
fun formatTimeDurations(durations: List<Int>, timeType: TimeType): List<String> { return durations.map { duration -> val pluralResId = when (timeType) { TimeType.MINUTES -> R.plurals.minute TimeType.HOURS -> R.plurals.hour } // 直接传入Int类型的duration,避免类型歧义 resources.getQuantityString(pluralResId, duration, duration) } }
调用示例:
val formattedList = formatTimeDurations(listOf(1, 5, 10, 15, 30), TimeType.MINUTES) // 输出结果:["1 minute", "5 minutes", "10 minutes", "15 minutes", "30 minutes"]
关键注意事项
- 确保输入的
durations列表元素类型为Int,如果原列表是混合类型,先做转换:durations.map { it as Int } - 不要在分支逻辑中让数值变量混入非Int类型,比如避免
val title = if (...) duration else "invalid"这种写法,会导致title被推断为Any getQuantityString的第二个参数是复数规则判断依据(必须是Int),第三个参数是字符串占位符的替换值,两者通常保持一致即可
内容的提问来源于stack exchange,提问作者Alex20280
相关产品推荐
相关产品推荐

