Как получить доступ к фрагментам

У меня Android Studio 3.6.3. Создал проект на котлине на основе шаблона Navigation Drawer Activity. В сгенерированный файлах, в content_main.xml есть фрагмент nav_host_fragment, а также в файле mobile_navigation.xml есть такие фрагменты как nav_home, nav_gallery, nav_slideshow. Есть сгенерированные фрагмент классы как HomeFragment, GalleryFragment и т.д. Пункты меню в Navigation Drawer нормально нажимаются, фрагменты меняются в соответствии с меню. Фрагменты наполняю нужной информацией.

Но, проблема в том, что из активити не могу получить доступ к активному фрагменту. supportFragmentManager.fragments возвращает только один фрагмент nav_host_fragment. Этот фрагмент никак не конвертируются через as ни к одному классу фрагментов, таких как HomeFragment, GalleryFragment и т.д.

Например, val frag = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) val glr = frag as GalleryFragment - выдает исключение

findFragmentById не находит остальных фрагментов таких как nav_home, nav_gallery, nav_slideshow.

Как получить активный на данный момент фрагмент? Каким образом создаются экземпляры этих фрагментов, как меняются?

Там, кажется, все управляется посредством этих строк:

    val navController = findNavController(R.id.nav_host_fragment)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    appBarConfiguration = AppBarConfiguration(setOf(
            R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow, R.id.nav_tizim), drawerLayout)
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)

Но, непонятно как.


Ответы (1 шт):

Автор решения: Andrew

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

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

interface AdapterInterface{
    fun myFunction(position: Int....)
}

дальше в конструкторе адаптера нужно указать данный интерфейс:

class ListAdapter(... private var adaptInterface: AdapterInterface... ) : RecyclerView.Adapter<ChatHolder>() {

}

в активности при вызове конструктора адаптера нужно писать:

listAdapter = ListAdapter(... this@MyFragment)

либо если это активность (список должен находится в ней):

listAdapter = ListAdapter(... this)

после этого фрагмент/активность предложит вам подключить данный интерфейс и переопределить его методы, в итоге у вас в фрагменте будет функция интерфейса myFunction. Ну и наконец, вызываете в адаптере метод интерфейса и передаете нужные вам данные.

→ Ссылка