Как я могу получить текущий фрагмент в NavHostFragment? - PullRequest
0 голосов
/ 05 июня 2018

Я пытался найти метод в новых компонентах навигации, но ничего не нашел по этому поводу.

У меня есть текущий пункт назначения:

mainHostFragment.findNavController().currentDestination

Но я не могу получить ссылку на отображаемый фрагмент.

Ответы [ 3 ]

0 голосов
/ 22 августа 2018

Вы можете сделать что-то вроде этого:

  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        val navHostFragment = supportFragmentManager.fragments.first() as? NavHostFragment
        if(navHostFragment != null) {
            val childFragments = navHostFragment.childFragmentManager.fragments
            childFragments.forEach { fragment ->
                fragment.onActivityResult(requestCode, resultCode, data)
            }
        }
    }

Но для более продвинутой связи Слушатели с методами обратного вызова зарегистрированы в Fragment.onAttach () (Fragment -> Activity rather one direction communication) и SharedViewModel (bidirectional, важно иметь скорее ViewModelProviders, and Lifecycle owner that is scoped to getActivity())

0 голосов
/ 16 ноября 2018

Используя ответ Михала, я написал эту функцию расширения для тестирования:

@Suppress("UNCHECKED_CAST")
fun <F : Fragment> AppCompatActivity.getFragment(fragmentClass: Class<F>): F? {
    val navHostFragment = this.supportFragmentManager.fragments.first() as NavHostFragment

    navHostFragment.childFragmentManager.fragments.forEach {
        if (fragmentClass.isAssignableFrom(it.javaClass)) {
            return it as F
        }
    }

    return null
}

Используется так:

val myFragment = activity.getFragment(MyFragment::class.java)
0 голосов
/ 05 июня 2018

Навигация не предоставляет какого-либо механизма для получения реализации (т. Е. Самого фрагмента) текущего назначения.

Согласно Создание обратных вызовов событий для действия , вы должны либосвязаться с вашим Фрагментом с помощью

  • Если Фрагмент зарегистрирует обратный вызов в своем методе onAttach, приведя вашу Активность к экземпляру интерфейса, который вы предоставляете
  • Использование общего доступаViewModel, которые ваша активность и фрагмент используют для общения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...