在viewmodel中获取字符串资源

Get string resources in viewmodel

我需要在 TextView 中以百分比形式显示值,例如“15 %” 我通过这种方式在 viewModel 中完成它并且它有效:

                    perfusionIndexValue.postValue(
                        list.lastOrNull()?.perfusionIndex?.takeIf {
                            it != PerfusionIndex.NO_DATA
                        }?.value?.toString().orEmpty() + " %"
                    )

但如果我用资源来做:

                    perfusionIndexValue.postValue(
                        list.lastOrNull()?.perfusionIndex?.takeIf {
                            it != PerfusionIndex.NO_DATA
                        }?.value?.toString().orEmpty() + Resources.getSystem().getString(R.string.pi_percent)
                    )

我明白了

io.reactivex.rxjava3.exceptions.UndeliverableException: The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with. Further reading: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | android.content.res.Resources$NotFoundException: String resource ID #0x7f0e0081

我如何设置像“15 %”这样的文本

使用以下命令从视图模型中的资源中获取字符串 -

String s = getApplication().getString(R.string.pi_percent);

在你的情况下,我看到你需要这里的上下文。

但是,不应将片段的上下文或 Activity 传递到 ViewModel。仅使用 Application Context 获取资源,...或与 ViewModel 中的 Application 相关的内容。

在这里,如果您没有使用 Hilt(或 Dagger),那么您应该将 ViewModel() 替换为 AndroidViewModel(application),如下所示:

class MyViewModel(application: Application): AndroidViewModel(application) {
    ...
}

如果使用 Hilt,您可以像下面这样通过 @ApplicationContext 注释注入应用程序上下文,而无需扩展 AndroidViewModel():

@HiltViewModel
class MyViewModel @Inject constructor(
    @ApplicationContext private val context: Context
): ViewModel() {

}

Here I note when using Hilt to inject Application Context into the ViewModel. You will see a warning about memory leak when injecting the Application Context into the ViewModel. This is a warning in the recent Hilt version, but I have tested Profiler and there is no leak.

并且您可以通过调用以下方式在 ViewModel 中获取资源作为字符串资源:

val myText = context.getString(R.string.your_string_id)