Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get view from drawer header layout with binding in activity?

So this is my activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> <layout 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"         tools:context="MainActivity"     >     <!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->     <android.support.v4.widget.DrawerLayout         android:id="@+id/drawer_layout"         android:layout_width="match_parent"         android:layout_height="match_parent"         >          <!-- As the main content view, the view below consumes the entire              space available using match_parent in both dimensions. -->          <RelativeLayout             android:layout_width="match_parent"             android:layout_height="match_parent">              <LinearLayout                 android:id="@+id/ll_container"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:orientation="vertical">                  <android.support.v7.widget.Toolbar                     android:id="@+id/my_awesome_toolbar"                     android:layout_width="match_parent"                     android:layout_height="wrap_content"                     android:background="@android:color/black"                     android:fitsSystemWindows="true"                     >                      <TextView                         android:id="@+id/toolbar_title"                         android:layout_width="wrap_content"                         android:layout_height="wrap_content"                         android:layout_marginLeft="10dp"                         android:layout_marginStart="10dp"                         android:textColor="@android:color/white"                         android:textSize="@dimen/abc_text_size_title_material_toolbar"                         tools:text="@string/default_toolbar_title"/>                  </android.support.v7.widget.Toolbar>                   <FrameLayout                     android:id="@+id/container"                     android:layout_width="match_parent"                     android:layout_height="match_parent">                  </FrameLayout>             </LinearLayout>              <android.support.design.widget.FloatingActionButton                 android:id="@+id/fab_fuf"                 android:layout_width="wrap_content"                 android:layout_height="wrap_content"                 android:layout_alignParentBottom="true"                 android:layout_alignParentEnd="true"                 android:layout_alignParentRight="true"                 android:layout_marginBottom="20dp"                 android:layout_marginEnd="20dp"                 android:layout_marginRight="20dp"                 android:src="@drawable/flamme"                 app:fabSize="normal"                 />         </RelativeLayout>          <android.support.design.widget.NavigationView             android:id="@+id/navigation_view"             android:layout_width="wrap_content"             android:layout_height="match_parent"             android:layout_gravity="start"             android:background="@android:color/black"             **app:headerLayout="@layout/drawer_header"**             app:itemTextColor="@color/drawer_item_color_selector"             app:menu="@menu/menu_drawer"/>      </android.support.v4.widget.DrawerLayout> </layout> 

and I am using binding for the activity so I don't have to use the findViewById and cast it etc.. like this:

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);          Toolbar toolbar = binding.myAwesomeToolbar;         toolbarTitle = binding.toolbarTitle;         BalrogFontsHelper.SetKhandBoldToView(toolbarTitle);         setSupportActionBar(toolbar);         final ActionBar actionBar = getSupportActionBar();         if (actionBar != null) {             actionBar.setHomeAsUpIndicator(R.drawable.ic_dehaze_white_24);             actionBar.setDisplayHomeAsUpEnabled(true);             actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);             actionBar.setDisplayShowTitleEnabled(false);         }           drawerLayout = binding.drawerLayout;         **tvLoggedUserEmail = (TextView) findViewById(R.id.tv_logged_user_email);**         BalrogFontsHelper.SetKhandBoldToView(tvLoggedUserEmail); 

As you can see, I can get the views that are directly in the activity_main.xml layout by binding but when the view I am trying to get is not there I can't see the variable in the binding object.

drawer_header.xml:

    <?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"                 android:layout_width="match_parent"                 android:layout_height="96dp"                 xmlns:tools="http://schemas.android.com/tools"                 android:background="@android:color/black"                 android:theme="@style/ThemeOverlay.AppCompat.Dark">       <TextView         android:id="@+id/tv_logged_user_email"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_centerVertical="true"         android:layout_marginLeft="16dp"         tools:text="@string/login_placeholder_email"         android:textAllCaps="true"         android:textAppearance="@style/TextAppearance.AppCompat.Body2"         android:textSize="20sp"/>   </RelativeLayout> 

How could I get this tv_logged_user_email TextView in a binding way so I have:

**tvLoggedUserEmail = binding.tvLoggedUserEmail;** 
like image 690
RogerParis Avatar asked Aug 27 '15 10:08

RogerParis


People also ask

How do I show navigation drawer in all activities?

The user can view the navigation drawer when they swipe the activity's screen from the left edge of the android device. A user can also find it from the activity, by tapping the app icon (also known as the “hamburger” menu) in the action bar.

Can we use activity in navigation drawer?

As for how to switch between activities via the navigation drawer, you can just set up new intents within your selectItem() method: private void selectItem(int position) { // Handle Navigation Options Intent intent; switch (position) { case 0: intent = new Intent(currentActivity, NewActivity.


2 Answers

If you set app:headerLayout="@layout/drawer_header then you don't have to inflate the view again. You can just use .bind instead of .inflate.

You can get the already inflated header view and bind it like this:

View headerView = binding.navigationView.getHeaderView(0); DrawerHeaderBinding headerBinding = DrawerHeaderBinding.bind(headerView); 
like image 139
stefana Avatar answered Sep 29 '22 15:09

stefana


Updated solution (13/11/2015)

Solution: Update your Design Support Library to 23.1.1:

Changes for Design Support library 23.1.1:

  • Added the getHeaderView method to the NavigationView class.
  • Fixed a transparent background issue for a FloatingActionButton object on devices running Android 4.0 (API level 15) and lower. (Issue 183315)

See https://developer.android.com/tools/support-library/index.html for more info


Original solution

I don't know why there is no method which provides header view attached programmatically.

Instead, here's two solutions:

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation); View headerView = navigationView.inflateHeaderView(R.layout.header_layout) ImageView iv = (ImageView)headerview.findViewById(R.id.your_image_view) 

Or:

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation); View headerView = LayoutInflater.from(this).inflate(R.layout.header_layout, navigationView, false); navigationView.addHeaderView(headerView);  ImageView iv = (ImageView) headerView.findViewById(R.id.yourImageView) 
like image 20
leejaycoke Avatar answered Sep 29 '22 17:09

leejaycoke