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