vista una previa preliminar pasos para pagina obtener navegador imprimir impresora impresion google documento configurar como chrome android android-activity view binding drawer

android - una - vista preliminar en word 2010



¿Cómo obtener una vista desde el diseño del encabezado del cajón con el enlace en la actividad? (12)

Solución actualizada (13/11/2015)

Solución: Actualice su biblioteca de soporte de diseño a 23.1.1 :

Cambios para la biblioteca de soporte de diseño 23.1.1 :

  • Se agregó el método getHeaderView a la clase NavigationView .
  • Se corrigió un problema de fondo transparente para un objeto FloatingActionButton en dispositivos que ejecutan Android 4.0 (nivel de API 15) e inferior. (Número 183315)

Consulte https://developer.android.com/tools/support-library/index.html para obtener más información

Solución original

No sé por qué no hay ningún método que proporcione la vista de encabezado adjunta mediante programación.

En cambio, aquí hay dos soluciones:

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)

O:

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)

Así que este es mi 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>

y estoy usando el enlace para la actividad, así que no tengo que usar el findViewById y lanzarlo, etc. así:

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);

Como puede ver, puedo obtener las vistas que están directamente en el diseño activity_main.xml vinculando, pero cuando la vista que estoy tratando de obtener no está allí, no puedo ver la variable en el objeto de enlace.

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>

¿Cómo podría obtener este tv_logged_user_email TextView de forma vinculante por lo que tengo:

**tvLoggedUserEmail = binding.tvLoggedUserEmail;**


Esto funciona para mi.

MainActivity.java:

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); NavHeaderMainBinding binding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.nav_header_main, navigationView, false); navigationView.addHeaderView(binding.getRoot());

activity_main.xml:

<android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <RelativeLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <include layout="@layout/toolbar" /> </android.support.design.widget.AppBarLayout> </RelativeLayout> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:menu="@menu/activity_main_drawer" /> </android.support.v4.widget.DrawerLayout>

nav_header.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="account" type="lonja.dreamteam.su.trainingdiary.view_model.AccountViewModel"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="@dimen/nav_header_height" android:background="@drawable/header_background" android:gravity="bottom" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:theme="@style/ThemeOverlay.AppCompat.Dark"> <de.hdodenhof.circleimageview.CircleImageView android:id="@+id/imageView" android:layout_width="72dp" android:layout_height="72dp" android:src="@{account.sex}" app:civ_border_color="@color/colorAccent" app:civ_border_width="0dp" /> <TextView android:id="@+id/userName" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="@dimen/nav_header_vertical_spacing" android:text="@{account.name}" android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> </LinearLayout>


He actualizado las herramientas de compilación del administrador sdk de Android, luego 23.1.0 también funciona bien para mí.

Estoy usando buildToolsVersion "23.0.2" Antes de esto era 23.0.1 .

y no hay necesidad de usar:

(View) navigationView.findViewById(R.id.idOfViewFromHeaderView);

En tu actividad puedes utilizar directamente:

(View) findViewById(R.id.idOfViewFromHeaderView);


He tenido el mismo problema.

Una solución es inflar la vista del encabezado y agregarla programáticamente.

Me gusta esto:

DrawerHeaderBinding drawerHeaderBinding = DrawerHeaderBinding.inflate(LayoutInflater.from(navigationView.getContext())); navigationView.addHeaderView(drawerHeaderBinding.getRoot()); drawerHeaderBinding.tvLoggedUserEmail = "email"; drawerHeaderBinding.executePendingBindings();

Entonces elimine la aplicación: headerLayout y hágalo programáticamente. Sin embargo, creo que Google debería solucionar el problema central aquí, ya sea en la biblioteca de diseño o en la biblioteca de enlace de datos.


Prueba esto con la biblioteca de DataBinding que funciona para mí.

navigation_view_header.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <RelativeLayout android:layout_width="match_parent" android:layout_height="@dimen/navigation_view_header_height" android:paddingLeft="@dimen/navigation_view_padding" android:paddingTop="@dimen/navigation_view_top_padding" android:background="@color/colorPrimary"> <ImageView android:id="@+id/avatar" android:layout_width="@dimen/avatar_dimen" android:layout_height="@dimen/avatar_dimen" android:contentDescription="@null" android:src="@drawable/default_avatar" /> <TextView android:id="@+id/profile_email" android:layout_width="match_parent" android:layout_height="48dp" android:layout_below="@+id/avatar" android:text="email" android:textColor="@color/white" android:layout_alignParentBottom="true" android:gravity="center_vertical" /> </RelativeLayout> </layout>

activity_main.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="navigationItemSelectedListener" type="com.example.MainActivity"/> </data> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:tag="layout"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/my_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:titleTextColor="@color/white" android:background="@color/colorPrimary" app:theme="@style/Toolbar.Theme" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="@dimen/navigation_view_width" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:theme="@style/Theme.AppCompat.Light" app:menu="@menu/drawer_menu" app:navigationItemSelectedListener="@{navigationItemSelectedListener::onNavigationItemSelected}"/> </android.support.v4.widget.DrawerLayout> </layout>

y dentro de tu actividad:

ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); activityMainBinding.setNavigationItemSelectedListener(this);/* with this line navigation menu item selection events are handled in onNavigationItemSelected() specified in navigation_view_header.xml*/ NavigationViewHeaderBinding navigationViewHeaderBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.navigation_view_header,activityMainBinding.navigationView,false); activityMainBinding.navigationView.addHeaderView(navigationViewHeaderBinding.getRoot());

y asegúrese de que su actividad implemente NavigationView.OnNavigationItemSelectedListener


Puedes hacerlo. Primero inicialice la vista de navegación.

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);

y luego inicialice todas las vistas que están dentro de navigationView.

CircleImageView circleView = (CircleImageView) navigationView.findViewById(R.id.circleView); TextView name = (TextView) navigationView.findViewById(R.id.name); TextView email = (TextView) navigationView.findViewById(R.id.email); LinearLayout header = (LinearLayout) navigationView.findViewById(R.id.header);

y luego puedes usar esas vistas como desees. p.ej:

name.setText(NAME); email.setText(EMAIL);


Si configura app:headerLayout="@layout/drawer_header entonces no tiene que inflar la vista nuevamente. Puede usar .bind lugar de .inflate .

Puede obtener la vista de encabezado ya inflada y enlazarla de esta forma:

View headerView = binding.navigationView.getHeaderView(0); DrawerHeaderBinding headerBinding = DrawerHeaderBinding.bind(headerView);


Simplemente coloque navigationView.getHeaderView (0) luego use cualquier vista

TextView profile,info; NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); profile = navigationView.getHeaderView(0).findViewById(R.id.profile); info = navigationView.getHeaderView(0).findViewById(R.id.info); profile.setOnClickListener(this); info.setOnClickListener(this);


Tengo una solución un poco más limpia, donde no tengo que "contaminar" el fragmento / actividad con el código responsable de inflar y agregar la vista de encabezado a NavigationView. Implementé la clase de extensión para NavigationView. Lo hice así:

Diseño de mi actividad:

<data> <variable name="dashboard" type="ramps.view.model.DashboardScreenViewModel"/> </data> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <include layout="@layout/activity_dashboard" android:layout_width="match_parent" android:layout_height="match_parent" bind:dashboard="@{dashboard}" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:background="@color/white" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:navigationItemSelectedListener="@{dashboard.onMenuItemSelected}" app:model="@{dashboard.score}" app:menu="@menu/activity_main_drawer"/> </android.support.v4.widget.DrawerLayout>

Como puede ver, no hay ninguna aplicación: headerLayout en NavigationView, pero he agregado mi aplicación personalizada: model, con los datos que deseo pasar al diseño del encabezado. ¿Cómo definí este parámetro personalizado? Por clase de extensión:

public class NavigationViewExtensions { @BindingAdapter({"bind:model"}) public static void loadHeader(NavigationView view, ScoreViewModel model) { ViewNavigationHeaderBinding binding = ViewNavigationHeaderBinding.inflate(LayoutInflater.from(view.getContext())); binding.setScore(model); binding.executePendingBindings(); view.addHeaderView(binding.getRoot()); } }

Simplemente coloca esta clase en cualquier parte de tu proyecto. Y el diseño de mi cabecera:

<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto" > <data> <import type="android.view.View"/> <variable name="score" type="ramps.view.model.ScoreViewModel"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/graphite" android:gravity="bottom" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin_large" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin_large" android:theme="@style/ThemeOverlay.AppCompat.Dark"> <include android:id="@+id/player_details_header_score" layout="@layout/view_avatar_score_header" bind:score="@{score}"/> </LinearLayout>


Una solución bastante simple aquí. Supongamos que ha agregado su NavigationView como

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

Y que desea acceder a un TextView en nav_drawer_header.xml que tiene un ID de textView2 . Entonces solo usarías este código en tu actividad:

View headerContainer = navigationView.getHeaderView(0); // This returns the container layout in nav_drawer_header.xml (e.g., your RelativeLayout or LinearLayout) TextView textView2 = (TextView)headerContainer.findViewById(R.id.textView2); textView2.setText("Sorted!");

No es necesario inflar o interferir con su código existente, etc.


ImageView imageView = (ImageView) navigationView.getHeaderView(0).findViewById(R.id.imageButton); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (flag) { navigationView.getMenu().clear(); //clear old inflated items. navigationView.inflateMenu(R.menu.drawer_view1); flag = false; } else { navigationView.getMenu().clear(); //clear old inflated items. navigationView.inflateMenu(R.menu.drawer_view); flag = true; } } });


  • Edite su archivo de gradle para actualizar las bibliotecas com.android.support a la versión 23.1.1 o posterior.

  • Utilice navigationView.getHeaderView(i) , donde i es el índice de headerview . Si acaba de definir esta vista en el diseño, es 0 .