Android fragment navigation: how to navigate to an arbitrary fragment programmatically

Viewed 142

I am learning to use Android fragment navigation.

Now I can follow the sample to use ID to navigate to a specific target fragment defined in the navigation graph. Like following:

<fragment android:id="@+id/a"
          android:name="com.example.myapplication.FragmentA"
          android:label="a"
          tools:layout="@layout/a">
    <action android:id="@+id/action_a_to_b"
            app:destination="@id/b"
            app:enterAnim="@anim/nav_default_enter_anim"
            app:exitAnim="@anim/nav_default_exit_anim"
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
</fragment>

viewTransactionsButton.setOnClickListener { view ->
   view.findNavController().navigate(R.id.viewTransactionsAction)
}

However, I have a special use case that I want to programmatically navigate to a destination fragment, which is not defined in the navi graph. How can I achieve it like following:

itemView.setOnclickListener { view ->
    val targetFragmentClass = getTargetFragmentClass(view)
    //How can I findNavController().navigate() to created targetFragmentClass instance?
}

I checked the document of navigation controller, all versions of its navigate() method need some resource ID which means I have to define the action or destination in the XML. But I want something like the legacy fragment manger APIs, which I can instantiate any fragment class and create a transaction to apply it.

So, my questions is:

  1. Can I use navigation component to navigate to any arbitrary fragment purely programmatically?
  2. If I have to use fragment manager/transaction to deal with this case, can I make it work with the navigation controller together?

Thanks a lot.

0 Answers
Related