2015-07-06 4 views
22

Wie der Titel sagt, möchte ich wissen, ob es eine Möglichkeit gibt, Ansichten innerhalb der NavigationView Header zu steuern? (Außer dem Hinzufügen oder Entfernen von Header.)Gibt es eine Möglichkeit, Ansichten in NavigationView Header zu steuern?

Zum Beispiel: In der Kopfzeile habe ich einen Benutzer-Avatar. Standardmäßig wird ein Gastbild angezeigt, aber nachdem sich der Benutzer angemeldet hat, wird der echte Avatar angezeigt.

Wie kann dies erreicht werden?

+0

Es liegt an Ihnen, was Sie in der Kopf Aufpumpen werden Aussicht. Sie können 'ImageView' in' LinearLayout' aufnehmen und ImageDrawable dynamisch ändern. – Moinkhan

+0

Konnten Sie mehr Details zeigen, ex meine Überschrift nur mit Textview in FrameLayout. –

+2

beziehen Sie sich auf diese Antwort .. http://Stackoverflow.com/a/30660069/3544839 ... – Moinkhan

Antwort

52

Nach der Aktualisierung Ihrer Support-Bibliothek auf Version 23.1.1 oder höher,

Sie könnten dies tun -

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

oder wenn Sie

navigationView.getHeaderCount() 

Ref mehrere Header haben: https://code.google.com/p/android/issues/detail?id=190226#c31

7

Da kann ich keinen Kommentar als Antwort akzeptieren. Also, umbuchen i Moinkhan‘Antwort hier:

ersten Kopf XML erstellen wie lay_header.xml

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

auf Ihre Java-Datei, die diese oben Header in einem Textview aufzublasen. wie

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

Nun fügen Sie es als HeaderView

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

es Das ist ...

Sie können es auch beim Check-out: Customising NavigationView - Adding dynamic headerView, Android Support Design Library

Vielen Dank! Und wieder brauchen wir eine Funktion, die es dem Benutzer erlaubt, einen Kommentar als Antwort zu akzeptieren!

0

einfach versuchen, Ihre Ansicht in Ihrer Tätigkeit finden:

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

Es funktioniert für mich. Mein Kopf Layout ist:

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

Mein NavigationView in Activity-Layout ist:

<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"/> 

Und BTW, Ich habe dieses Problem beim Aufpumpen Linearlayout, in dem Layout params nicht vorgesehen ist:

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

Hoffe es hilft.

+0

Sie scheinen nicht auf die aktuelle TextView-ID zu verweisen. Wie würden Sie die tatsächliche TextView unterscheiden oder identifizieren, wenn Sie mehrere TextViews im Header-Layout haben? Ich nehme an, Sie würden es als eine Ansicht aufblasen dann aus der Sicht können Sie die TextView von ID bekommen? – Nerudo

+0

@Nerudo, nun, es ist im Header Layout: android: id = "@ + id/tv_username". und referenziere es nach ID findViewById (R.id.tv_username); –

1

Der andere Weg, dies zu machen, ist die Methode "inflateHeaderView()" von NavigationView Objekt verwenden, wie unten (Nach der Verwendung von "setContentView()"):

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

Nach diesem Punkt können Sie „headerLayout verwenden "für den Zugriff auf benutzerdefinierte Ansichten in Ihrem Header-Layout, wie unten:

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

in meinem Fall i butter Rahmen bin mit Blick zu injizieren "navigationView" wie folgt aus:

@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

Diese Methode ist in Ordnung, solange der Header nicht bereits in der XML-Navigationsansicht definiert ist. Wenn dies der Fall ist, fügt das Aufrufen von inflateheaderview eine zusätzliche Kopfzeile in der Seitenschublade hinzu. – RmK