Really the best and correct way to handle this is to use an interface. View models should really be used for passing data between the activity and fragments. Here is how I solved this problem:
Create interface
interface NavigationInterface {
fun referenceCourseListFragment(fragment: CourseListFragment)
fun referenceCouseDetailFragment(fragment: CourseDetailInfoFragment)
}
Make sure activity implements interface
class NotesActivity : AppCompatActivity(), NavigationInterface {}
Make sure to create lateinit var for each fragment you need to reference and then
private lateinit var courseListFragment: CourseListFragment
private lateinit var courseDetailInfoFragment: CourseDetailInfoFragment
Now in each fragment in the onCreateView method, make sure to create the interface listener and passback the fragment with the interface
private lateinit var navigationInterface: NavigationInterface
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
//establish interface communication
activity?.let {
instantiateNavigationInterface(it)
}
// Inflate the layout for this fragment
fragmentView = inflater.inflate(R.layout.fragment_course_list, container,
false)
navigationInterface.referenceCourseListFragment(this)
return fragmentView
}
Now back in the activity, you should be able to instantiate your fragment objects for reference via interface callback
override fun referenceCourseListFragment(fragment: CourseListFragment) {
courseListFragment = fragment
}
override fun referenceCouseDetailFragment(fragment: CourseDetailInfoFragment)
{
courseDetailInfoFragment = fragment
}