返回

如何在 Android 应用中从本地化字符串资源获取数据?

Android

## ViewModel 与 Context:从本地化字符串资源中获取数据

引言

在构建 Android 应用时,本地化对提供无缝的用户体验至关重要。本文将探讨如何使用 ViewModel 和 Context 从本地化字符串资源中检索数据。

问题陈述

为了提供本地化体验,我们需要获取本地化字符串资源并从中创建数据列表。

理解 ViewModel 和 Context

  • ViewModel: 存储与 UI 状态相关的数据,独立于 Activity 或 Fragment 生命周期。
  • Context: 提供对系统资源和应用环境的访问。

使用 LocalContext

直接在 ViewModel 中持有 Context 可能导致内存泄漏。因此,建议使用 LocalContext,它不会持有对 Activity 或 Fragment 的引用。

从 ViewModel 中获取字符串资源

private val context = LocalContext.current

fun getString(stringResId: Int): String {
    return context.getString(stringResId)
}

在 MyData 类中使用 SavedStateHandle

MyData 类用于存储本地化字符串列表。我们可以使用 SavedStateHandle 在 ViewModel 中存储和恢复状态。

private val savedStateHandle: SavedStateHandle

init {
    savedStateHandle = SavedStateHandle()
}

获取字符串列表

val stringList = savedStateHandle.get<List<String>>(LIST_KEY)
if (stringList == null) {
    // 初始化列表
    initializeData()
} else {
    listC.addAll(stringList)
}

初始化数据

fun initializeData() {
    // ...(与原始代码相同)

    // 将字符串列表存储到 SavedStateHandle 中
    savedStateHandle[LIST_KEY] = listC
}

结论

通过使用 LocalContextSavedStateHandle,我们可以从 ViewModel 中检索本地化字符串资源,同时避免内存泄漏。这使得在 Android 应用中提供本地化体验变得更加容易。

常见问题解答

1. 为什么不直接在 ViewModel 中使用 Context?

直接持有 Context 会导致内存泄漏,因为 ViewModel 独立于 Activity 或 Fragment 生命周期。

2. LocalContext 是什么?

LocalContext 是一个不持有对 Activity 或 Fragment 引用、提供对系统资源和应用环境访问的 Context。

3. SavedStateHandle 的作用是什么?

SavedStateHandle 用于存储和恢复 ViewModel 的状态,即使在设备旋转或应用重新启动后也是如此。

4. 为什么在 MyData 类中使用 SavedStateHandle?

MyData 类中使用 SavedStateHandle 是为了在 ViewModel 中存储本地化字符串列表。

5. 如何将字符串列表存储到 SavedStateHandle 中?

通过将键值对存储到 SavedStateHandle 中,可以将字符串列表存储为值,其中键是列表的唯一标识符。