在导航抽屉碎片之间发送数据



让我首先在表面级别描述我的应用程序。

  1. 应用程序具有导航抽屉,该抽屉由Android生成,具有2个默认视图(新的导航控制器(。

    a。主页查看

    b。历史视图

  2. 我已经为数据交换创建了一个视图模型

    a。DataViewModel

问题:

  1. 当我切换到历史视图并尝试更改消息时,它永远不会被观察到进入主页视图。

  2. 当我切换回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

相关内容

  • 没有找到相关文章

最新更新