从ViewModel访问strings.xml

5

我正在使用 Dagger 2 DataBindng 和新的 Android 生命周期组件,其中包括 ViewModels

在我的 ViewModel 中,我如何访问我的 strings.xml 文件?我最初想到的是将 Context 注入 viewModel,但这会导致内存泄漏。

还有其他方法吗?

1个回答

7

有一个AndroidViewModel,它接收Application实例作为参数。

从文档中可以看到:

应用程序上下文感知的ViewModel

子类必须有一个构造函数,该构造函数只接受Application作为参数。

您可以使用该参数从strings.xml检索字符串。


在链接中的存储库中,使用的是ViewModel而不是AndroidViewModel。如果我扩展我的ViewModel以使用AndroidViewModel并包含Application,则它正在尝试注入MyApplication而不是Application,如果这有意义的话。
我已经查看了GithubBrowserSample。这是UserViewModel的样子: public class UserViewModel extends ViewModel { ... @Inject public UserViewModel(UserRepository userRepository, RepoRepository repoRepository) { ... } ... }
以下是我所做的更改: public class UserViewModel extends AndroidViewModel { ... @Inject public UserViewModel(Application application, UserRepository userRepository, RepoRepository repoRepository) { super(application); ... } ... }

2
实际上,我仍然有一个问题。由于我使用了Dagger,我在我的模型中使用构造函数注入。这意味着我不能使用AndroidViewModel。有任何想法吗? - Robert J. Clegg
请查看 GithubBrowserSampleViewModel 是如何被注入的。 - azizbekian
这就是我注入ViewModel的方式。然而,链接中的repo使用的是ViewModel而不是AndroidViewModel。如果我扩展我的ViewModel以使用AndroidViewModel并包括Application - 它会尝试注入MyApplication而不是Application,如果这有意义的话。 - Robert J. Clegg
你还能用 JUnitViewModel 进行单元测试吗?如果我只需要将字符串从 ViewModel 传递到视图,那么从 Viewmodel 返回字符串资源 ID 到视图是否更准确? - mallaudin
1
@mallaudin,你是正确的,最好传递字符串ID而不是字符串本身,这样做的原因之一在此文章中有概述。 - azizbekian
感谢@azizbekian分享这篇文章。 - mallaudin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接