Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NavigationView how to handle dynamic header content

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.

like image 364
Murat Erdogan Avatar asked Jul 23 '15 06:07

Murat Erdogan


2 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.

like image 156
Sabeeh Avatar answered Sep 29 '22 12:09

Sabeeh


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);
like image 25
NueK Avatar answered Sep 29 '22 12:09

NueK