web-dev-qa-db-ja.com

NavHostFragmentで現在のフラグメントを取得するにはどうすればよいですか?

新しいナビゲーションコンポーネントでメソッドを見つけようとしましたが、それについては何も見つかりませんでした。

現在の目的地は次のとおりです。

mainHostFragment.findNavController().currentDestination

しかし、表示されたフラグメントへの参照を取得できません。

10
BenjaminBihr

ナビゲーションは、現在の宛先の実装(つまり、フラグメント自体)を取得するメカニズムを提供しません。

アクティビティへのイベントコールバックの作成 に従って、フラグメントと通信する必要があります。

  • FragmentにonAttachメソッドでコールバックを登録させ、アクティビティを指定したインターフェイスのインスタンスにキャストします
  • 共有ViewModelを使用 アクティビティとフラグメントが通信に使用します。
15
ianhanniballake

次のようなことができます:

  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)および SharedViewModelbidirectionalViewModelProviders, and Lifecycle owner that is scoped to getActivity()を持つことが重要)

12
Michał Ziobro

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)
2
CampbellMG