【问题标题】:How to fix Resources$NotFoundException: String resource in Kotlin without context?如何在没有上下文的情况下修复 Resources$NotFoundException:Kotlin 中的字符串资源?
【发布时间】:2021-05-10 22:10:59
【问题描述】:

Android、Kotlin。

我想使用RestApiService 文件进行请求,并进一步从strings.xml 文件发送字符串值,如下所示:

fun showPostsInRadius(modelSearchParams: ModelSearch, onResult: (Array<Post>?, Boolean, String?) -> Unit){

    val retrofit = ServiceBuilder.buildService(RestApi::class.java)
    retrofit.showPostsInRadius(Build.VERSION.SDK_INT, modelSearchParams).enqueue(

        object : Callback<Array<ModelSearchResult>> {

            override fun onFailure(call: Call<Array<ModelSearchResult>>, t: Throwable) {
                onResult(null, false, Resources.getSystem().getString(R.string.connection_error_login))
                println(t)
            }
...

这行给出错误:

onResult(null, false, Resources.getSystem().getString(R.string.connection_error_login))

错误:

W/ResourceType: No known package when getting value for resource number 0x7f0f003c
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.jaskierltd.goodtogether, PID: 15205
    android.content.res.Resources$NotFoundException: String resource ID #0x7f0f003c
        at android.content.res.Resources.getText(Resources.java:338)
        at android.content.res.Resources.getString(Resources.java:432)
        at com.jaskierltd.goodtogether.network.RestApiService$showPostsInRadius$1.onFailure(RestApiService.kt:145)
        at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$2.run(ExecutorCallAdapterFactory.java:79)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

我应该配置与 strings.xml 文件相关的任何内容,还是应该使用其他方法调用它?现有主题都没有帮助。

【问题讨论】:

  • 恕我直言,onResult() 应该获取资源 ID,然后在 UI 层将其转换为字符串(活动/片段/可组合)。
  • @CommonsWare 我们可以。但是 R.string.my_text.toString() - 这给出了一个 ID。但是,我们不能用它来显示没有上下文的字符串吗?疯狂的。系统知道 ID EXACTLY 在哪里,但我们不能使用它?怎么可能?
  • "但是,我们不能在没有上下文的情况下使用它来显示 STRING 吗?" - 正确的。 “怎么可能?” ——这个世界上不止一种语言。某些东西需要能够在运行时根据用户和设备映射给定字符串资源 ID 使用的字符串。在 Android 中,那个“东西”是Context。如果您不喜欢这样,则不需要使用字符串资源。欢迎您以您喜欢的其他方式管理您的国际化字符串。

标签: android string kotlin


【解决方案1】:

由于没有人提供任何如何避免上下文的答案,唯一的方法是使用context 或获取STRING 对象的ID 并发回。

选项 #1:

// Place anywhere you want to get the String
fun getID(): Int{
   R.string.error_no_location
}

// Use this inside Activity
println(getString(getID()))

选项 #2:

fun getID(context: Context){
   println(context.getString(R.string.error_no_location))
}

【讨论】:

    【解决方案2】:

    我认为这可能取决于您的确切上下文,但对我来说,我在尝试在我的 ViewModel 中设置字符串资源时遇到了这个异常。

    正如@CommonsWare 在上面的评论中所说,我稍微调整了我的设计,以便我的 UI(可组合;我正在使用 Jetpack)从 Int 进行转换,因为可组合函数可以访问 stringResource() 方法。

    所以在我的ViewModel 类中(TextFieldState 是一个数据类,它只保存我的自定义文本字段的文本值/提示):

    private val _firearmInitialShotCount = mutableStateOf(TextFieldState(
            hint = R.string.enter_firearm_initial_shot_count
        ))
        val firearmInitialShotCount: State<TextFieldState> = _firearmInitialShotCount
    
    data class TextFieldState(
        val text: String = "",
        val hint: Int = 0,
        val isHintVisible: Boolean = true
    )
    

    然后在我的 Composable 函数中(TransparentHintTextField 只是一个自定义可组合项,它为 BasicTextField 添加了提示):

    val initialShotCountState = viewModel.firearmInitialShotCount.value
    
    TransparentHintTextField(
                    text = initialShotCountState.text,
                    hint = stringResource(id = initialShotCountState.hint),
    ...
    

    希望对某人有所帮助。我知道我的情况对我来说是特殊的,但我的想法是在代码中保存 String Resource Int,然后在 Int 上的 Composable 调用 stringResource() 中保存。

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2015-06-02
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      相关资源
      最近更新 更多