我想抽象出在 Android 中获取资源,所以我编写了一个ResourceProvider实际提供资源的类:@Singletonclass ResourceProvider @Inject constructor(private val context: Context) {fun getString(@StringRes id: Int): String { return context.getString(id)}fun getString(@StringRes id: Int, vararg formatArgs: Any): String { return context.getString(id, formatArgs)}...}这里没什么特别的,只是在Context. 当我想获取带参数的字符串时遇到问题,我创建了以下示例:var fromContext = requireContext().getString(R.string.one_parameter_string, "Text")Log.i("fromContext", fromContext)var fromWrapper = resourceProvider.getString(R.string.one_parameter_string, "Text")Log.i("fromWrapper", fromWrapper)fromContext = requireContext().getString(R.string.two_parameter_string, "Text", "Text")Log.i("fromContext", fromContext)fromWrapper = resourceProvider.getString(R.string.two_parameter_string, "Text", "Text")Log.i("fromWrapper", fromWrapper)以下是字符串资源:<string formatted="false" name="two_parameter_string">Text with parameters: %s, %s</string><string formatted="false" name="one_parameter_string">Text with parameter: %s</string>如您所见,我直接在课堂上Context和ResourceProvider课堂上调用相同的方法。我希望得到相同的结果,但实际上这是控制台中打印的内容:I/fromContext: Text with parameter: TextI/fromWrapper: Text with parameter: [Ljava.lang.Object;@6d43f06I/fromContext: Text with parameters: Text, TextD/AndroidRuntime: Shutting down VME/AndroidRuntime: FATAL EXCEPTION: main Process: xxx.xxx.xxx, PID: 22963正如您所看到的,直接在Context没有缺陷的作品上调用它,但是用我的包装器调用相同的方法会使其打印Object.toString(),并且在第二种情况下它会崩溃。这是该getString(@StringRes id: Int, vararg formatArgs: Any)方法的反编译版本:@NotNullpublic final String getString(@StringRes int id, @NotNull Object... formatArgs) { Intrinsics.checkParameterIsNotNull(formatArgs, "formatArgs"); String var10000 = this.context.getString(id, new Object[]{formatArgs}); Intrinsics.checkExpressionValueIsNotNull(var10000, "context.getString(id, formatArgs)"); return var10000;}有什么问题以及如何解决它?
1 回答

繁星淼淼
TA贡献1775条经验 获得超11个赞
您需要使用扩展运算符(*)来调用context.getString,即您需要使用*formatArgs:
@Singleton
class ResourceProvider @Inject constructor(private val context: Context) {
fun getString(@StringRes id: Int): String {
return context.getString(id)
}
fun getString(@StringRes id: Int, vararg formatArgs: Any): String {
return context.getString(id, *formatArgs)
}
...
}
您可以在kotlin 参考中阅读有关可变数量参数 (varargs)的更多信息。
如果您不这样做,则给定对象(在本例中为formatArgs-array)将被视为您要传递给 - 方法的单个对象,vararg因此将被包装到Object[] { formatArgs }.
添加回答
举报
0/150
提交
取消