新しいナビゲーションコンポーネントでメソッドを見つけようとしましたが、それについては何も見つかりませんでした。
現在の目的地は次のとおりです。
mainHostFragment.findNavController().currentDestination
しかし、表示されたフラグメントへの参照を取得できません。
ナビゲーションは、現在の宛先の実装(つまり、フラグメント自体)を取得するメカニズムを提供しません。
アクティビティへのイベントコールバックの作成 に従って、フラグメントと通信する必要があります。
onAttach
メソッドでコールバックを登録させ、アクティビティを指定したインターフェイスのインスタンスにキャストしますViewModel
を使用 アクティビティとフラグメントが通信に使用します。次のようなことができます:
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()
を持つことが重要)
Michalの答えを使用して、テスト用にこの拡張関数を作成しました。
@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)