Search code examples
androidandroid-fragmentsandroid-navigationandroid-architecture-navigationandroid-navigation-graph

Android NavigationUI startDestination class (not ID) programmatically


I need to set the start destination of a navigation graph programmatically depending on a condition. I have Fragment0, and also Fragment1, Fragment2, ... FragmentN all extending Fragment0, and being all of them (including Fragment0) able to be that wished start destination.

I already know there is the method from NavGraph called

setStartDestination(R.id.nav_fragment_X);

but it is not useful for me because, if I am not wrong, it requires to have all these fragment0...N nodes declared in the xml navigation file.

So, what I would like to, is to have just one fragment node in the xml file and be able to set, programmatically, the Class (a fragment in my case) that in normal cases you can indicate via the design/text tabs of android studio and is displayed like this:

    android:name="com.android.fragments.FragmentX"

Solution

  • I finally ended up with the answer:

    First you get your startDestination graph by, for instance, executing:

    NavDestination startDestNode = navGraph.findNode(R.id.start_dest);
    

    And, later, you update the class name by getting use of:

    ((FragmentNavigator.Destination) startDestNode).setClassName("Class name you wish");
    

    In conclusion, the method setClassName(String className) of the class FragmentNavigator.Destination allows you to indicate the fragment class that will be displayed associated with the destination.