Comment obtenir la vue à partir de tiroir en-tête de mise en page avec la liaison de l'activité?
Donc c'est mon 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>
et je suis en utilisant la liaison de l'activité donc je n'ai pas à utiliser le findViewById, et de le jeter etc.. comme ceci:
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);
Comme vous pouvez le voir, je peux obtenir les points de vue qui sont directement dans le activity_main.xml mise en page par contraignant, mais quand l'idée que j'essaie de le faire n'est pas là, je peux pas voir la variable de l'objet de liaison.
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>
Comment pourrais-je obtenir ce tv_logged_user_email TextView dans une voie de liaison j'ai donc:
**tvLoggedUserEmail = binding.tvLoggedUserEmail;**
Vous devez vous connecter pour publier un commentaire.
Mise à jour de la solution (13/11/2015)
Solution: mettre à Jour votre Conception de la Bibliothèque de prise en charge à
23.1.1
:Voir https://developer.android.com/tools/support-library/index.html pour plus d'info
Solution originale
Je ne sais pas pourquoi il n'y a pas de méthode qui fournit une vue d'en-tête
joint par programmation.
Au lieu de cela, voici deux solutions:
Ou:
J'ai un peu plus propre solution, où je n'ai pas "polluer" fragment/activité avec le code responsable pour le gonflage et l'ajout de l'en-tête de la vue de la fenêtre des éléments. J'ai mis en place une extension de la classe de la fenêtre des éléments. Je l'ai fait comme ceci:
Présentation de mon activité:
Comme vous pouvez le voir, il n'y a pas d'application:headerLayout dans la fenêtre des éléments, mais j'ai ajouté mon appli personnalisée:modèle, avec les données que je veux passer à l'en-tête de disposition.
Comment ai-je définir ce paramètre personnalisé? Par extension de la classe:
Il suffit de placer cette classe n'importe où dans votre projet. Et la mise en page de mon en-tête:
J'ai le même problème.
Une solution de contournement est de gonfler l'en-tête de la vue et de l'ajouter par programmation.
Comme ceci:
Afin de supprimer l'application:headerLayout et de le faire par programmation. Je pense que google devrait résoudre le problème fondamental ici, que ce soit dans la conception de la bibliothèque ou dans la liaison de données de la bibliothèque.
<FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" >
Si vous définissez
app:headerLayout="@layout/drawer_header
alors vous n'avez pas à gonfler les afficher de nouveau. Vous pouvez simplement utiliser.bind
au lieu de.inflate
.Vous pouvez obtenir le déjà gonflé vue d'en-tête et lier de cette façon:
Assez simple, une solution ici. Supposons que vous avez ajouté votre la fenêtre des éléments comme
Et que vous souhaitez accéder à un TextView dans
my_nav_drawer_header.xml
qui a un id detextView2
. Si vous utilisez ce code dans votre activité:Pas besoin de gonfler ou interférer avec votre code existant, etc.
Essayer cela avec la liaison de données de la bibliothèque, ça marche pour moi.
navigation_view_header.xml:
activity_main.xml:
et au sein de votre activité:
et assurez-vous que votre activité met en œuvre
NavigationView.OnNavigationItemSelectedListener
Modifier votre gradle fichier de mise à jour com.android.soutien bibliothèques à la version 23.1.1 ou au-delà.
Utilisation
navigationView.getHeaderView(i)
, oùi
est l'indice de laheaderview
. Si vous venez de définir ce point de vue sur la mise en page, est0
.J'ai mis à jour d'outils de compilation à partir de l'Android sdk manager, puis
23.1.0
est aussi bien fonctionner pour moi.Je suis en utilisant
buildToolsVersion "23.0.2"
Avant cela, il était23.0.1
.et il n'y a pas besoin de l'aide:
Dans votre activité, vous pouvez utiliser directement:
Viens de mettre la fenêtre des éléments.getHeaderView(0) puis utilisez l'une des vues
Cela fonctionne pour moi.
MainActivity.java:
activity_main.xml:
nav_header.xml:
Vous pouvez le faire. Tout d'abord initialiser l'affichage de navigation.
puis initialiser tous les points de vue qui est à l'intérieur de la fenêtre des éléments.
et vous pouvez ensuite utiliser ces points de vue comme vous le souhaitez.
par exemple: