Home » Android » android – NavigationView how to handle dynamic header content

android – NavigationView how to handle dynamic header content

Posted by: admin June 15, 2020 Leave a comment

Questions:

I have a pretty standard NavigationView. When i use a static layout in the header like below it works perfect.

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/nav_header"
    app:menu="@menu/drawer_view"/>

But i want to have a dynamic header so thah i can change it when user logged in etc… So i tried to use a fragment instead of nav_header.xml

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/fragment_header"
    app:menu="@menu/drawer_view"/>

Can i use a fragment in the headerLayout so i can handle all my logic in the fragment’s java file. Or what is the right solution to handle this problem.

How to&Answers:

You can do that in code by inflating custom layout and set it’s header for navigation view.

NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView);
View nav_header = LayoutInflater.from(this).inflate(R.layout.nav_header, null);
((TextView) nav_header.findViewById(R.id.name)).setText("UserName");
navigationView.addHeaderView(nav_header);

You don’t need to set app:headerLayout in xml.

Answer:

You could call the header declared on xml like this:

NavigationView navigationView= (NavigationView) findViewById (R.id.navigationView);    
View header = navigationView.getHeaderView(0);

And then get the views like this:

TextView text = (TextView) header.findViewById(R.id.text);