前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[译]区域设置更改和 AndroidViewModel 反面模式

[译]区域设置更改和 AndroidViewModel 反面模式

作者头像
Android 开发者
发布2024-01-28 09:35:51
930
发布2024-01-28 09:35:51
举报
文章被收录于专栏:Android 开发者Android 开发者

TL;DR:从视图模型中公开资源 ID 以避免显示废弃的数据。

在 ViewModel 中,如果要公开来自资源(字符串、可绘制文件、颜色……)的数据,则必须着重考虑 ViewModel 对象而忽视配置更改,例如区域设置更改。当用户更改其区域设置时,活动将重新被创建,但不创建 ViewModel 对象。

AndroidViewModel 是已知应用程序上下文的 ViewModel 的子类。然而,如果您没有注意到或没有对上下文的生命周期做出反应,访问上下文可能是危险的。建议的做法是避免处理在 ViewModels 中具有生命周期的对象。

让我们看看跟踪器中基于此问题的示例:在系统区域设置更改时更新 ViewModel

代码语言:javascript
复制
// 别这么做
public class MyViewModel extends AndroidViewModel {
    public final MutableLiveData<String> statusLabel = new MutableLiveData<>();
    
    public SampleViewModel(Application context) {
        super(context);
        statusLabel.setValue(context.getString(R.string.labelString));
    }
}

问题的关键是字符串在构造器中只解释一次。如果有区域设置更改,则不会重新创建视图模型。这将导致我们的应用程序显示废弃的数据,因此只能部分本地化。

正如 Sergey 在评论中指出的那样 comments,推荐的方法是公开要加载的资源的 ID ,并在视图中这样做。由于视图(活动、片段等)具有生命周期意识,因此它将在配置更改后重新创建,以便正确地重新加载资源。

代码语言:javascript
复制
// 显示资源ID
public class MyViewModel extends ViewModel {
    public final MutableLiveData<Int> statusLabel = new MutableLiveData<>();
    
    public SampleViewModel(Application context) {
        super(context);
        statusLabel.setValue(R.string.labelString);
    }
}

即使你不打算本地化你的应用程序,它也会使测试变得更容易并且清空你的 ViewModel 对象,因此没有理由不去考虑它的前瞻性。

我们在以 Java 为基础的 Android 架构存储库中解决了这个问题 Java 以及在Kotlin 分支上。我们也把资源转移到 数据绑定布局

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档