При использовании Навигации и NavHostFragment
ваши Фрагменты являются дочерними фрагментами NavHostFragment
в вашем макете.
Fragment navHostFragment = getSupportFragmentManager().findFragmentById(
R.id.nav_host_fragment); // Whatever your ID in your layout is
FragmentManager childFragmentManager = navHostFragment.getChildFragmentManager();
// Now you can get your Fragment from the childFragmentManager
MyFragment fragment = childFragmentManager.findFragmentByid(R.id.fragmentId);
Однако рекомендуемый шаблон для передачи интерфейсов вашим Фрагментам в мире Навигациичерез инжекцию в конструктор с использованием FragmentFactory
, как обсуждалось в Фрагментах: прошлое, настоящее и будущее :
// Create an interface for what methods you want to expose
interface Callback {
// whatever methods you want
}
// Change your Fragment to take in that interface
class MyFragment(val callback: Callback) : Fragment() {
// Now your Fragment always has a reference to the Callback
}
private class MyActivityFactory(
callback: Callback
) : FragmentFactory() {
override fun instantiate(
classLoader: ClassLoader,
className: String
) = when (className) {
MyFragment::class.java.name -> MyFragment(callback)
else -> super.instantiate(classLoader, className)
}
}
// Now update your MyActivity to implement the interface
// and pass itself into an instance of the FragmentFactory you created
class MyActivity : AppCompatActivity(), Callback {
override fun onCreate(savedInstanceState: Bundle?) {
supportFragmentManager.fragmentFactory =
MyActivityFactory(this)
super.onCreate(savedInstanceState)
...
}
}
Используя FragmentFactory
, воссоздание после изменений конфигурации ипервоначальное создание обрабатывается таким же образом. Это также позволяет вам проверить ваш фрагмент изолированно , используя FragmentScenario
(что занимает FragmentFactory
)