Kotdroid
Kotdroid

Reputation: 165

Nested Navigation Graph With NavigationView in it

I have the scenario like I have one MainActivity which contains (login/signup fragments). And I have one HomeActivity(which contains navigationview with drawer layout in it.)

and both two activities are having their separate navigation_graph. When I include home_navigation_graph in main_navigation_graph and navigate to it the DrawerLayout doesn't work. But when I do it separately like withou nesting only calling the home_navigation_graph(HomeActivity) as launcher everything works fine. Here is my sample code:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph_login"
    app:startDestination="@id/loginFragment">

    <fragment
        android:id="@+id/loginFragment"
        android:name="com.example.app.ui.login.LoginFragment"
        android:label="LoginFragment"
        tools:layout="@layout/fragment_login">
        <action
            android:id="@+id/action_loginFragment_to_signupFragment"
            app:destination="@id/signupFragment" />
        <action
            android:id="@+id/action_loginFragment_to_mobile_navigation"
            app:destination="@id/mobile_navigation"
            app:launchSingleTop="true"
            app:popUpTo="@+id/nav_graph_login"
            app:popUpToInclusive="true" />
    </fragment>

    <fragment
        android:id="@+id/signupFragment"
        android:name="com.example.app.ui.signup.SignupFragment"
        android:label="SignupFragment"
        tools:layout="@layout/fragment_signup">
        <action
            android:id="@+id/action_signupFragment_to_loginFragment"
            app:destination="@id/loginFragment"
            app:launchSingleTop="true"
            app:popUpTo="@id/signupFragment"
            app:popUpToInclusive="true" />
    </fragment>

    <include app:graph="@navigation/mobile_navigation" />
</navigation>

when I call the second mobile navigation graph at login button click(using code belwo) the HomeActivity opens but with only homeDestinationFragment is visble rest nothing works

findNavController().navigate(R.id.action_loginFragment_to_mobile_navigation)

and below the code is for home_navigation_graph.xml

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mobile_navigation"
    app:startDestination="@+id/nav_home">

    <fragment
        android:id="@+id/nav_home"
        android:name="com.example.app.ui.home.HomeFragment"
        android:label="@string/menu_home"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/nav_gallery"
        android:name="com.example.app.ui.earnings.VendorEarningFragment"
        android:label="@string/menu_vendor_earning"
        tools:layout="@layout/fragment_vendor_earning" />

    <fragment
        android:id="@+id/nav_slideshow"
        android:name="com.example.app.ui.slideshow.SlideshowFragment"
        android:label="@string/menu_slideshow"
        tools:layout="@layout/fragment_slideshow" />

    <fragment
        android:id="@+id/nav_tools"
        android:name="com.example.app.ui.tools.ToolsFragment"
        android:label="@string/menu_tools"
        tools:layout="@layout/fragment_tools" />

    <fragment
        android:id="@+id/nav_share"
        android:name="com.example.app.ui.share.ShareFragment"
        android:label="@string/menu_share"
        tools:layout="@layout/fragment_share" />

    <fragment
        android:id="@+id/nav_send"
        android:name="com.example.app.ui.send.SendFragment"
        android:label="@string/menu_send"
        tools:layout="@layout/fragment_send" />
</navigation>

Please let me know what I'm missing. I'm stuck at this for weeks.

Upvotes: 3

Views: 878

Answers (2)

Kumar Shubham
Kumar Shubham

Reputation: 31

In MainActivity which contains (login/signup fragments) use the given below code:

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    frgmtloginbtn.setOnClickListener {
        findNavController().navigate(R.id.mainActivity)
    }
}

Don't pass the id of any fragment instead of that pass the main activity or login/signup Activity

In your home_navigation_graph just include containing the drawer layout and navigation menu instead of whole graph. it will work fine

<include app:graph="@navigation/mobile_navigation" />

and Replace with this

<activity
android:id="@+id/mainActivity"
android:name="com.example.nav_experiment.MainActivity"
android:label="activity_main"
tools:layout="@layout/activity_main" />

I hope so this will work for you, if have any other Query let me know happy to help you

Upvotes: 3

Gautam Mittal
Gautam Mittal

Reputation: 66

In your home_navigation_graph just include containing the drawer layout and navigation menu instead of whole graph. And it worked fine for me you can just check out my github repo.

replace below lines

 <include app:graph="@navigation/mobile_navigation" />

with this code snippet below

<activity
    android:id="@+id/mainActivity"
    android:name="com.example.nav_experiment.MainActivity"
    android:label="activity_main"
    tools:layout="@layout/activity_main" />

In below Git link there is Navigation Drawer which get open on Login Button Click, As per Query asked

For Detail Description Follow git Link -> https://github.com/gautammittal23/NaV_Graph_With_login_navigation_drawer

Upvotes: 4

Related Questions