Wie kann man in Android das Kopfbild und den Namen der Navigationsschublade programmgesteuert in der Klassendatei festlegen?

Lesezeit: 7 Minuten

Benutzer-Avatar
Kalai

In Android Studio 1.4.1 habe ich ein neues Navigation Drawer-Projekt erstellt, das Standard ist. Mein Problem ist, dass in diesem Projekt die Datei nav_header_main.xml vorhanden ist, die für das Bild und den Namen der Navigationskopfzeile vorgesehen ist. Ich möchte, dass dieses Bild und dieser Name programmgesteuert in meiner Hauptklassenaktivität festgelegt werden. Wie das geht, habe ich viel versucht, aber die App stürzt ab.

nav_header_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout        
android:layout_width="match_parent"
android:id="@+id/headerView"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
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">

<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/nav_header_vertical_spacing"
    android:src="https://stackoverflow.com/questions/33560219/@android:drawable/sym_def_app_icon" />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/nav_header_vertical_spacing"
    android:text="Android Studio"
    android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="[email protected]" />

</LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout            

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"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">

<include
    layout="@layout/app_bar_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<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:headerLayout="@layout/nav_header_main"
    app:menu="@menu/activity_main_drawer" />

    </android.support.v4.widget.DrawerLayout>

MainActivity.Class

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LinearLayout headerImageView= (LinearLayout) findViewById(R.id.headerView);


        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            Toast.makeText(getApplicationContext(),"working",Toast.LENGTH_LONG).show();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camara) {
            // Handle the camera action
        } else if (id == R.id.nav_gallery) {

        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);

        return true;
    }
}

Benutzer-Avatar
Triệu Đô La

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
View hView = navigationView.getHeaderView(0);
TextView nav_user = (TextView) hView.findViewById(R.id.nav_name);
nav_user.setText(user);

  • navigationView.getHeaderView(0); warum verwenden wir dort 0?

    – Lahiru Liyanage

    20. September 2020 um 7:35 Uhr


Wie im Bug erwähnt 190226Seit Version 23.1.0 Header-Layout-Ansicht erhalten mit:
navigationView.findViewById(R.id.navigation_header_text) funktioniert nicht mehr.

Eine Problemumgehung besteht darin, die Kopfzeilenansicht programmgesteuert aufzublasen und die Ansicht anhand der ID aus der aufgeblähten Kopfzeilenansicht zu finden.

Zum Beispiel:

View headerView = navigationView.inflateHeaderView(R.layout.navigation_header);
headerView.findViewById(R.id.navigation_header_text);

Idealerweise sollte es eine Methode geben getHeaderView() aber es wurde bereits vorgeschlagen, mal sehen und warten, bis es in der Feature-Release der Design-Support-Bibliothek veröffentlicht wird.

  • Können Sie bitte sagen, wie man auch die Textansicht und die Bildansicht hinzufügt

    – Kalai

    6. November 2015 um 6:32 Uhr

  • Alter, wie in der Antwort erwähnt, können Sie das Header-Layout (mit Bildansicht, Textansicht oder beliebigen Ansichten im Header-Layout) aufblasen inflateHeaderView() Methode und kann die Ansicht aus demselben aufgeblasenen Layout mit finden findViewById()

    – Gemeinde Mayani

    6. November 2015 um 6:34 Uhr


  • Navigationsansicht navigationView = null; HeaderView anzeigen = navigationView.inflateHeaderView (R.layout.nav_header_main); TextView tv=(TextView)headerView.findViewById(R.id.textView); tv.setText (“überprüfen”); Dies ist mein Code, obwohl die App abstürzt

    – Kalai

    6. November 2015 um 7:46 Uhr


  • Es funktioniert mit dem angegebenen Beispiel und denken Sie daran, die Zeile aus zu entfernen android.support.design.widget.NavigationView app:headerLayout="@layout/nav_header_main" weil Sie bereits programmgesteuert aufblasen

    – MilapTank

    10. Februar 2016 um 12:12 Uhr

  • Der Kommentar von @milapTank hat geholfen, da die Kopfzeilenansicht zweimal aufgeblasen wurde, bis ich die von ihm vorgeschlagene Zeile aus meinem XML entfernt habe.

    – Taimur Khan

    4. Mai 2016 um 11:19 Uhr

fügen Sie keinen Header in XML hinzu, indem Sie Code verwenden, indem Sie das Layout aufblasen

View hView =  navigationView.inflateHeaderView(R.layout.nav_header_main);
ImageView imgvw = (ImageView)hView.findViewById(R.id.imageView);
TextView tv = (TextView)hView.findViewById(R.id.textview);
imgvw .setImageResource();
tv.settext("new text");

  • Ja, das ist leicht das Ergebnis, danke bhai .

    – Sajid Khan

    14. März 2019 um 10:06 Uhr


  • wie kann ich das in kotlin implementieren?

    – Gipfel

    20. Oktober 2021 um 19:22 Uhr

In Kotlin

    val hView = nav_view.getHeaderView(0)
    val textViewName = hView.findViewById(R.id.textViewName) as TextView
    val textViewEmail = hView.findViewById(R.id.textViewEmail) as TextView
    val imgvw = hView.findViewById(R.id.imageView) as ImageView
    imgvw.setImageResource(R.drawable.ic_menu_gallery)

Zuerst müssen Sie wie folgt auf die Navigationsleiste in Ihrer Hauptaktivität (oder der Anrufaktivität) zugreifen:

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

Dann müssen Sie das Header-Layout aus der activity_main.xml entfernen, da das Layout programmatisch in der MainActivity aufgeblasen wird. Ihre activity_main.xml sollte so aussehen:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout            

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"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">

<include
    layout="@layout/app_bar_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

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

Dann blasen wir in Ihrer MainActivity das nav_header_main-Layout auf und erhalten Zugriff auf seine Ansichten, in diesem Fall ImageView und TextView

//inflate header layout
View navView =  navigationView.inflateHeaderView(R.layout.nav_header_main);
//reference to views
ImageView imgvw = (ImageView)navView.findViewById(R.id.imageView);
TextView tv = (TextView)navView.findViewById(R.id.textview);
//set views
imgvw.setImageResource(R.drawable.your_image);
tv.setText("new text");

navigationView.setNavigationItemSelectedListener(this);

Sie können mehr lesen hier

Benutzer-Avatar
Blauwaren

val navigationView: NavigationView =  findViewById(R.id.nv)
val header: View = navigationView.getHeaderView(0)
val tv: TextView = header.findViewById(R.id.profilename)
tv.text = "Your_Text"

Dies wird Ihr Problem beheben <3

Hier ist mein Code unten, der perfekt funktioniert. Fügen Sie den Header nicht im NavigationView-Tag in activity_main.xml hinzu

<include
    layout="@layout/app_bar_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<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"
    app:itemBackground="@drawable/active_drawer_color" />

Header programmgesteuert mit dem folgenden Code hinzufügen

View navHeaderView = navigationView.inflateHeaderView(R.layout.nav_header_main);
    headerUserName = (TextView) navHeaderView.findViewById(R.id.nav_header_username);
    headerMobileNo = (TextView) navHeaderView.findViewById(R.id.nav_header_mobile);
    headerMobileNo.setText("+918861899697");
    headerUserName.setText("Anirudh R Huilgol");

  • hat bei mir nicht funktioniert, es zeigt einen leeren nav_header. (ohne Text und Bild)

    – maximal

    6. Juni 2017 um 9:57 Uhr

  • @maximus Ich werde den Code auf GitHub hochladen und Sie können nach dem Fehler suchen, den Sie gemacht haben.

    – Anirudh R.Huilgol.

    6. Juni 2017 um 10:40 Uhr


1287170cookie-checkWie kann man in Android das Kopfbild und den Namen der Navigationsschublade programmgesteuert in der Klassendatei festlegen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy