Android Studio中如何通过字符串资源为ViewModel变量传值?
可行,但要注意ViewModel的使用规范
首先明确:可以实现字符串占位符的填充,但ViewModel本身不能直接持有普通Context(避免内存泄漏),所以得用合适的方式处理:
两种常用实现方式
方式一:UI层负责格式化(推荐,符合架构职责)
ViewModel只提供所需的资源ID和数值,把字符串格式化的操作交给Activity/Fragment(持有合法Context)来完成:
// ViewModel代码 class MathViewModel : ViewModel() { val questionType = R.string.add val num1 = 5 val num2 = 3 }
// Activity/Fragment代码 val viewModel = ViewModelProvider(this)[MathViewModel::class.java] val formattedQuestion = getString(viewModel.questionType, viewModel.num1, viewModel.num2) // 得到结果:"5 + 3?"
方式二:通过AndroidViewModel获取全局Context
如果需要在ViewModel内部完成格式化,可以让ViewModel继承AndroidViewModel,它能安全获取全局的Application Context(不会造成内存泄漏):
// ViewModel代码 class MathViewModel(application: Application) : AndroidViewModel(application) { val questionType = R.string.add fun getFormattedQuestion(num1: Int, num2: Int): String { return getApplication<Application>().getString(questionType, num1, num2) } }
// Activity/Fragment代码 val viewModel = ViewModelProvider(this)[MathViewModel::class.java] val formattedQuestion = viewModel.getFormattedQuestion(5, 3)
注意事项
优先用方式一,因为ViewModel的核心职责是处理业务逻辑、提供数据,资源格式化属于UI层的展示相关操作,分离职责更利于维护和测试。
内容的提问来源于stack exchange,提问作者Pson
相关产品推荐
相关产品推荐

