web-dev-qa-db-fra.com

Existe-t-il un moyen de contrôler les vues à l'intérieur de l'en-tête NavigationView?

Comme le titre l'indique, je veux savoir s'il existe un moyen de contrôler les vues à l'intérieur de l'en-tête NavigationView? (Sauf pour ajouter ou supprimer un en-tête.)

Par exemple: dans l'en-tête, j'ai un avatar d'utilisateur. Par défaut, il affiche une image d'invité, mais après la connexion de l'utilisateur, le véritable avatar sera affiché.

Comment cela peut-il être accompli?

25
Lạng Hoàng

Après avoir mis à jour votre bibliothèque d'assistance vers la version 23.1.1 ou supérieure,

Vous pourriez le faire -

View header = navigationView.getHeaderView(0);
TextView text = (TextView) header.findViewById(R.id.textView);

ou si vous avez plusieurs en-têtes

navigationView.getHeaderCount()

Réf: https://code.google.com/p/Android/issues/detail?id=190226#c31

57
RmK

Puisque je ne peux pas accepter un commentaire comme réponse. Donc, je republie la réponse de Moinkhan ici:

créez d'abord l'en-tête XML comme lay_header.xml

<TextView
    Android:id="@+id/tvThought"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content" />

sur votre fichier Java gonflez cet en-tête ci-dessus dans un TextView. comme

TextView headerView = (TextView) LayoutInflater.from(this).inflate(R.layout.lay_header, null);
headerView.setText("Your_thoght");

Maintenant, ajoutez-le en tant que HeaderView

navView = (NavigationView) findViewById(R.id.navView);
navView.addHeaderView(headerView);

C'est tout...

Vous pouvez également le vérifier à: Personnalisation de NavigationView - Ajout d'en-tête dynamique, Android Support Design Library

Merci beaucoup! Et encore une fois, nous avons besoin d'une fonction qui permet à l'utilisateur d'accepter un commentaire comme réponse!

7
Lạng Hoàng

L'autre façon de procéder consiste à utiliser la méthode "inflateHeaderView ()" de l'objet NavigationView, comme ci-dessous (après avoir utilisé "setContentView ()"):

View headerLayout = navigationView.inflateHeaderView(R.layout.yours_nav_header_layout);

Après ce point, vous pouvez utiliser "headerLayout" pour accéder aux vues personnalisées dans votre disposition d'en-tête, comme ci-dessous:

View cutomView = (TextView) headerLayout.findViewById(R.id.lay_sign_in);

Dans mon cas, j'utilise le framework ButterKnife pour injecter View "navigationView" comme ceci:

@Bind(R.id.nav_view) NavigationView navigationView;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }
1
GFPF

Essayez simplement de trouver votre point de vue dans votre activité:

tvUserName = (TextView) findViewById(R.id.tv_username);

Ça marche pour moi. Ma disposition d'en-tête est:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="192dp"
    Android:background="?attr/colorPrimaryDark"
    Android:padding="16dp"
    Android:theme="@style/ThemeOverlay.AppCompat.Dark"
    Android:orientation="vertical"
    Android:gravity="bottom">

    <TextView
        Android:id="@+id/tv_username"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:textAppearance="@style/TextAppearance.AppCompat.Body1"/>

</LinearLayout>

Ma NavigationView dans la présentation d'activité est:

<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/drawer_header"
    app:menu="@menu/menu_drawer"/>

Et BTW, je suis tombé sur un problème lors du gonflage de LinearLayout, où les paramètres de disposition ne sont pas fournis:

TextView headerView = (TextView) LayoutInflater.from(this).inflate(R.layout.lay_header, null);
headerView.setText("Your_thoght");

J'espère que ça aide.

0
Jiawei Dai