首页 > 解决方案 > 在导航抽屉片段之间发送数据

问题描述

让我先从表面上描述我的应用程序。

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

    一个。主页查看

    湾。历史视图

  2. 我创建了一个用于数据交换的视图模型

    一个。数据视图模型

问题:

  1. 当我切换到 HistoryView 并尝试更改消息时,它永远不会被观察到 HomeView。

  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);

首页片段 -

        // @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;
                }
            }
        });

标签: androidnavigation-drawerandroid-viewmodel

解决方案


尽量不要在每个片段中实例化视图模型,而是在 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


推荐阅读