Отправка данных между фрагментами ящика навигации - PullRequest
0 голосов
/ 04 августа 2020

Позвольте мне сначала описать мое приложение на поверхностном уровне.

  1. Приложение имеет панель навигации, которая была создана Android с двумя представлениями по умолчанию (новый контроллер навигации).

    а. HomeView

    б. HistoryView

  2. Я создал модели просмотра для обмена данными

    a. DataViewModel

Проблемы:

  1. Когда я переключаюсь на HistoryView и пытаюсь изменить сообщение, оно никогда не попадает в HomeView.

  2. Когда я переключаюсь обратно на HomeView, я вижу последнее измененное значение в консоли.

@ james04 упоминается, чтобы добавить код для справки - вот он является -

MainActivity -

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

HistoryFragment -

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

1 Ответ

0 голосов
/ 07 августа 2020

Старайтесь не создавать экземпляр viewModel в каждом фрагменте, а вместо этого создавать его в MainActivity и получать ссылку из каждого фрагмента через действие. Пример

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...