我想抽象出在 Android 中获取资源,所以我编写了一个ResourceProvider实际提供资源的类:
@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)
}
...
}
这里没什么特别的,只是在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: Text
I/fromWrapper: Text with parameter: [Ljava.lang.Object;@6d43f06
I/fromContext: Text with parameters: Text, Text
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: xxx.xxx.xxx, PID: 22963
正如您所看到的,直接在Context没有缺陷的作品上调用它,但是用我的包装器调用相同的方法会使其打印Object.toString(),并且在第二种情况下它会崩溃。
这是该getString(@StringRes id: Int, vararg formatArgs: Any)方法的反编译版本:
@NotNull
public 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;
}
有什么问题以及如何解决它?
繁星淼淼
相关分类