android - 在导航抽屉片段之间发送数据
问题描述
让我先从表面上描述我的应用程序。
应用程序具有由 Android 生成的导航抽屉,具有 2 个默认视图(新导航控制器)。
一个。主页查看
湾。历史视图
我创建了一个用于数据交换的视图模型
一个。数据视图模型
问题:
当我切换到 HistoryView 并尝试更改消息时,它永远不会被观察到 HomeView。
当我切换回 HomeView 时,我会在控制台中看到最后更改的值。
@james04 提到要添加参考代码 - 这里是 -
主要活动 -
DrawerLayout drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home, R.id.nav_history)
.setOpenableLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
首页片段 -
// @onCreateView
dataViewModel = new ViewModelProvider(getActivity()).get(DataViewModel.class);
// @onViewCreated
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dataViewModel.getMessage().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(String s) {
Log.d("MESSAGES","Labels - > " + s);
}
});
}
历史片段 -
// @onCreateView
dataViewModel = new ViewModelProvider(getActivity()).get(DataViewModel.class);
// @onViewCreated
setMessages.setOnCheckedChangeListener(new
RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int id) {
switch (id){
case R.id.apple:
dataViewModel.setMessage("Apple");
break;
case R.id.banana:
dataViewModel.setMessage("Banana");
break;
}
}
});
解决方案
尽量不要在每个片段中实例化视图模型,而是在 MainActivity 中实例化它,并通过活动从每个片段中获取引用。例子
主要活动
public DataViewModel dataViewModel;
onCreate () {
......
dataViewModel = new ViewModelProviders.of(this).get(DataViewModel.class)
}
并在每个片段上获得如下视图模型
dataViewModel.getMessage().observe(this, new Observer()...)
并以相同的方式将值设置为消息
getActivity().dataViewModel.setMessage("Apple");
还将代码从片段从 onActivityCreated 移动到 onViewCreated
推荐阅读
- excel - 停止电源查询加载到 Excel 工作表
- apache-nifi - NiFi PutDatabaseRecord 处理器在 WHERE 子句中使用子查询进行更新
- scala - Scala Json 模式
- php - PHP 发送一个空的响应负载而不是 JSON
- python - 如何在一次函数调用中正确加密和解密句子?
- c# - 以编程方式设置 Visual Studio 项目调试属性
- javascript - 如何使用gridstack使动态创建的元素可拖动?
- javascript - auth0 Management Api NextJs 无法更新元数据
- python - 在 tkinter 中抖动边界
- sql - 根据连续日期对记录进行分组