Как передать данные в начальный фрагмент из OnClickListener целевого фрагмента FloatingActionButton при использовании NavController?

#android #android-fragments #android-navigation-graph

#Android #android-фрагменты #android-navigation-graph

Вопрос:

Я пытаюсь передать данные из OnClickListener плавающей кнопки actionButton целевого фрагмента в начальный фрагмент при использовании NavController. Плавающий actionButton находится в Activity, в котором размещены все фрагменты.

В настоящее время я могу вернуться к предыдущему фрагменту из OnClickListener плавающего actionButton следующим образом:

                 Bundle bundle = new Bundle();
                bundle.putSerializable(BUNDLE_KEY_SELECTED, selected);
                NavController navController = NavHostFragment.findNavController(FragmentSelectSongs.this);
                navController.popBackStack();

  

Однако я хочу отправить этот пакет в начальный фрагмент. Документы здесь передают данные в начальный пункт назначения, скажем, для установки нового графика и добавления пакета. Однако это разрушает backstack. Даже если я сделаю это:

                 NavController navController = NavHostFragment.findNavController(FragmentSelectSongs.this);
                navController.setGraph(navController.getGraph(), bundle);
                navController.popBackStack();
  

Это возвращает меня к начальному фрагменту. Как мне с этим справиться?

Должен ли я выполнить действие из пункта назначения в пункт запуска и передать другое значение, а затем дважды вставить backstack?

Комментарии:

1. Если вы пытаетесь вернуть результат фрагменту, уже находящемуся в заднем стеке, есть ли причина, по которой вы не используете API навигации для возврата результата ?

2. Потому что «передача данных между фрагментами» казалась наиболее вероятным местом для поиска ответа! Спасибо за предложение. Я решил просто сохранить переменную в основном действии и избежать проблем с решениями Android.

Ответ №1:

Вы пробовали это?

 navController.navigate(R.id.fragment_id_to_send_bundle, bundle);
  

Комментарии:

1. Да. Я получаю исключение IllegalArgumentException из-за того, что требуемые аргументы не имеют значения по умолчанию. Проблема в том, что когда я даю аргументам значения по умолчанию, метод actionFragmentAToFragmentB(), сгенерированный safeargs, становится методом с 0 аргументами, и я больше не могу передавать аргументы, когда это необходимо. Есть ли способ передать аргументы с помощью NavigateTo()?

2. Я понял это, но есть ли какое-то место, где хранятся строковые значения для аргументов? Сейчас я использую жестко закодированные значения. NavigateTo() действительно сработал. Тем не менее, это добавляет дополнительный шаг к backstack, поэтому я надеюсь, что повторное нажатие стека исправит это.

3. Это сработало! Мне пришлось использовать navigate(R.id.fragment_id_to_send_bundle, bundle) вместо NavigateTo (R.id.fragment_id_to_send_bundle, bundle) и обязательно добавить необходимые аргументы в пакет.

4. О, извините, я не проверил имя метода, но был уверен, что это было что-то вроде этого. Обновил мой ответ

5. Обратите внимание, что для безопасных классов, генерируемых аргументами, аргументы со значениями по умолчанию создают set методы — вы бы сделали actionFragmentAToFragmentB().setArg(whatever)