让我首先在表面级别描述我的应用程序。
-
应用程序具有导航抽屉,该抽屉由Android生成,具有2个默认视图(新的导航控制器(。
a。主页查看
b。历史视图
-
我已经为数据交换创建了一个视图模型
a。DataViewModel
问题:
-
当我切换到历史视图并尝试更改消息时,它永远不会被观察到进入主页视图。
-
当我切换回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);
HomeFragment-
// @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;
}
}
});
尽量不要在每个片段中实例化viewModel,而是在MainActivity中实例化它,并通过活动从每个片段获得引用。示例
主要活动
public DataViewModel dataViewModel;
onCreate () {
......
dataViewModel = new ViewModelProviders.of(this).get(DataViewModel.class)
}
在每个片段上获得如下所示的viewModel
dataViewModel.getMessage().observe(this, new Observer()...)
并以相同的方式将值设置为消息
getActivity().dataViewModel.setMessage("Apple");
还将片段中的代码从onActivityCreated移动到onViewCreated