Как получить доступ к фрагментам
У меня 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 шт):
Сложная у вас система честно говоря, нужно смотреть так: список находится в фрагменте, значит итоговые данные нужно передавать из фрагмента, если данные поступают в фрагмент из активности то нужно брать либо bundle либо тоже интерфейс подключать.
Для того чтобы передавать данные из адаптера в активность/фрагмент чаще всего используют интерфейс. Для это создают файл интерфейса и пишут функцию которая необходима для связи с фрагментом, в качестве аргументов используйте данные которые вы хотите передавать:
interface AdapterInterface{
fun myFunction(position: Int....)
}
дальше в конструкторе адаптера нужно указать данный интерфейс:
class ListAdapter(... private var adaptInterface: AdapterInterface... ) : RecyclerView.Adapter<ChatHolder>() {
}
в активности при вызове конструктора адаптера нужно писать:
listAdapter = ListAdapter(... this@MyFragment)
либо если это активность (список должен находится в ней):
listAdapter = ListAdapter(... this)
после этого фрагмент/активность предложит вам подключить данный интерфейс и переопределить его методы, в итоге у вас в фрагменте будет функция интерфейса myFunction. Ну и наконец,
вызываете в адаптере метод интерфейса и передаете нужные вам данные.