Saba Imran
Saba Imran

Reputation: 191

How to get NavHostFragment

I'm integrating Android's Navigation Architecture Components into my app. I ran into some problems with passing data to the start of a fragment from an activity, so I was following this answer: Navigation Architecture Component- Passing argument data to the startDestination.

The logic seems sound to me, but I'm struggling to determine how to actually get the NavHostFragment. Elliot Shrock used this line -

val navHostFragment = navFragment as NavHostFragment

But I haven't found a Java equivalent that works. I tried getting the fragment of my navHost by using getSupportFragmentManager().findFragmentById(R.id.[mynavhostid])

but this command is returning null. Any ideas?

Upvotes: 9

Views: 10693

Answers (6)

Nikhil S Marathe
Nikhil S Marathe

Reputation: 771

If you want to inflate NavHost via Fragment then use this code in app.

btnClick.setOnClickListener(view -> {
          NavHostFragment.findNavController(getParentFragment())
                .navigate(R.id.activity_login_to_homeFragment); 
       }

on this code ID MUST BE SAME AS NAVIGATION.XML File attachment.

Upvotes: 0

Alex Fedorenko
Alex Fedorenko

Reputation: 1

So, attempting to retrieve the NavController in onCreate() of the Activity using Navigation.findNavController(Activity, @IdRes int) will fail. You will have to directly retrieve it from the support fragment manager. First, make sure your activity extends AppCompatActivity. Otherwise, you will not be able to use getSupportFragmentManager(). Then, this code should work:

NavHostFragment navHostFragment =
                    (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
NavController navController = navHostFragment.getNavController();

Further reading: https://developer.android.com/guide/navigation/navigation-getting-started

Upvotes: 0

vanJoseph
vanJoseph

Reputation: 11

Actually, verify that the NavHostFragement id in XML matches up with the one you are refering to in your code.

Upvotes: 0

Daniel Wilson
Daniel Wilson

Reputation: 19824

Note, for some reason the debugger will sometimes return null for a NavHostFragment where the code can actually find it without issue. I have no idea why but it's occupied probably 3 hours of my time, make sure it is in fact null by printing or using the fragment!

enter image description here

Upvotes: 1

Abir Hossain
Abir Hossain

Reputation: 111

This thing worked for me

 val navHostFragment = nav_host_fragment as NavHostFragment

Upvotes: 2

Saba Imran
Saba Imran

Reputation: 191

I solved this by first inflating the view which contains the NavHost, then using the supportFragmentManager to get the navHost Fragment and pass in my default args.

Hoping that Google's Android team provides a cleaner solution to this in the future.

Upvotes: 4

Related Questions