java - 如何使用导航底部菜单存储片段的状态
问题描述
我正在尝试将我的片段组件的值存储在一个具有较低导航菜单的活动中,由 navController 控制。我的问题是,当我使用底部导航将一个片段更改为另一个片段(onPause)或旋转屏幕时,组件布局中的所有数据都会丢失。有解决这个问题的方法吗?
解决方案
将数据存储在 Viewmodel 中并从 UI 中观察它。如果框架在配置更改或其他事件期间销毁并重新创建活动和片段,则存储的数据不会丢失。
https://developer.android.com/topic/libraries/architecture/viewmodel?hl=en
创建扩展 ViewModel 的类并将变量作为 LiveData 存储在其中,如下例所示:
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<User>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// Do an asynchronous operation to fetch users.
}
}
然后您可以像这样从活动和片段访问视图模型。
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
// Create a ViewModel the first time the system calls an activity's onCreate() method.
// Re-created activities receive the same MyViewModel instance created by the first activity.
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
有关更多详细信息,请查看上面链接中的文档。
推荐阅读
- php - 在没有 javascript 的任何标签内添加 html
- javascript - 如何在 TinyMCE 中调用 javascript 函数?
- android - 没有 Playstore 的深度链接/应用程序链接
- c# - 如何在 C# 中创建一个接收字符串并根据内部逻辑返回值的简单 API?
- python - 将列作为参数传递给 pandas groupby 应用函数
- python - Pygame 不会在 M1 MacBook Air 上初始化游戏窗口
- mysql - Informix 数据库到 MySQL 数据库备份/记录替换与特定表
- html - 为什么我的位置绝对框会从外部泄漏内容
- javascript - 如何编辑完成提示?
- rfid - 标签数据中的 EPC 位方向