Как передать данные из фрагмента в прежний фрагмент?
Как передать данные из фрагмента в прежний фрагмент (из фрагмента В в фрагмент А)? Вот мой код, но он даже не реагирует на получение данных. Чтобы убедиться в этом, я установил простое всплывающее уведомление.
Фрагмент А
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.infos_trafic, container, false)
buttonGoToB = view.findViewById(R.id.fragment_B)
findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<String>("key")?.observe(
viewLifecycleOwner) { result -> Toast.makeText(this, "Ok", Toast.LENGTH_SHORT).show()
}
buttonGoToB.setOnClickListener { goToB() }
return view
}
private fun goToB()
{
parentFragmentManager.commit{
setCustomAnimations(R.anim.slide_up, R.anim.slide_down, R.anim.slide_up, R.anim.slide_down)
add(R.id.main_nav_host, FragmentB())
addToBackStack(null)
}
}
Фрагмент В
buttonBack.setOnClickListener {
findNavController().previousBackStackEntry?.savedStateHandle?.set("key", "myString")
parentFragmentManager.popBackStack()
}
Ответы (2 шт):
Решение по ссылке
Фрагмент А
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Use the Kotlin extension in the fragment-ktx artifact
setFragmentResultListener("requestKey") { requestKey, bundle ->
// We use a String here, but any type that can be put in a Bundle is supported
val result = bundle.getString("bundleKey")
// Do something with the result
}
}
Фрагмент В
button.setOnClickListener {
val result = "result"
// Use the Kotlin extension in the fragment-ktx artifact
setFragmentResult("requestKey", bundleOf("bundleKey" to result))
}
Возможно вы не хотите имено передавать между фрагментами bundle, так как вопрос можно решить общей ViewModel для этих фрагментов. Инициализируйте viewModel в активити, которой принадлежат эти фрагменты. Теперь в своих фрагментах сделайте следующее:
lateinit var viewModel: MainViewModel
activity?.let {
viewModel = ViewModelProvider(it, defaultViewModelProviderFactory).get(MainViewModel::class.java)
}
Теперь фрагментам доступно все, что есть в viewModel. Например можно инициализировать LiveData в вашей viewModel и подписаться на изменения во фрагментах.