wake-up-neo.com

Wie kann man in Android das Header-Image der Navigations-Schublade und den Namen programmgesteuert in der Klassendatei festlegen?

In Android Studio 1.4.1 habe ich ein neues Navigations-Zeichnungsprojekt erstellt, das standardmäßig aktiviert ist. Mein Problem ist in diesem Projekt die Datei nav_header_main.xml, die für das Navigations-Header-Image und den Navigationsnamen dient. Ich möchte, dass dieses Image und der Name in meiner Hauptklassenaktivität programmgesteuert 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="@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;
    }
}
58
kalai
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);

ich hoffe das hilft!

193
Triệu Đô La

Wie im Bug 190226 erwähnt, funktioniert seit dem Abrufen der Headerlayoutansicht mit: navigationView.findViewById(R.id.navigation_header_text) die Version 23.1.0 nicht mehr.

Eine Problemumgehung besteht darin, die Kopfübersicht programmatisch aufzublasen und die Ansicht nach ID aus der aufgeblasenen Kopfansicht zu suchen.

Zum Beispiel:

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

Idealerweise sollte es eine Methode getHeaderView() geben, die jedoch bereits vorgeschlagen wurde. Lassen Sie uns sehen und warten, bis sie im Feature-Release der Design-Support-Bibliothek veröffentlicht wird.

46
Paresh Mayani

fügen Sie keinen Header in XML hinzu. Verwenden Sie Code, um das Layout aufzublasen

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");
15
Ashish Agrawal

Zunächst müssen Sie auf die Navigationsleiste in Ihrer MainActivity (oder auf die aufrufende Aktivität) wie folgt zugreifen:

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

Dann müssen Sie das Header-Layout aus der Datei activity_main.xml entfernen, da das Layout in der MainActivity programmgesteuert 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);

Lesen Sie mehr hier

4
  nav = ( NavigationView ) findViewById( R.id.navigation );

    if( nav != null ){
        LinearLayout mParent = ( LinearLayout ) nav.getHeaderView( 0 );

        if( mParent != null ){
            // Set your values to the image and text view by declaring and setting as you need to here.

            SharedPreferences prefs = getSharedPreferences("user_data", MODE_PRIVATE);
            String photoUrl = prefs.getString("photo_url", null);
            String user_name = prefs.getString("name", "User");

            if(photoUrl!=null) {
                Log.e("Photo Url: ", photoUrl);

                TextView userName = mParent.findViewById(R.id.user_name);
                userName.setText(user_name);

                ImageView user_imageView = mParent.findViewById(R.id.avatar);

                RequestOptions requestOptions = new RequestOptions();
                requestOptions.placeholder(R.drawable.ic_user_24dp);
                requestOptions.error(R.drawable.ic_user_24dp);

                Glide.with(this).load(photoUrl)
                        .apply(requestOptions).thumbnail(0.5f).into(user_imageView);

            }

        }
    }

Hoffe das hilft.

4
Saurabh Singh

Hier ist mein Code Unten einwandfrei 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" />

fügen Sie den Header programmatisch mit dem folgenden Code hinzu

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

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)
3
Naveed Ahmad

Ich weiß, dass dies ein alter Beitrag ist, aber ich bin sicher, dass dies jemandem auf der Straße helfen könnte.

Sie können einfach das headerView-Element der Navigationsansicht erhalten, indem Sie Folgendes tun: 

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

 if( mView != null ){
     LinearLayout mParent = ( LinearLayout ) mView.getHeaderView( 0 );

     if( mParent != null ){
        // Set your values to the image and text view by declaring and setting as you need to here. 
     }
 }

Ich hoffe, das hilft jemandem.

2
Ronnie

Es ist ein alter Beitrag, aber es ist neu für mich. So ist es einfach! In diesem Teil des Codes:

 public boolean onNavigationItemSelected(MenuItem item) {

} , Habe ich eine ImageView an das LinearLayout gebunden, das die ImageView aus dem unten aufgeführten Beispiel enthält. Achtung: Es ist derselbe Code, den Sie erhalten, wenn Sie ein neues Projekt starten und die Vorlage "Navigation Drawer Activity" auswählen: 

<ImageView
Android:id="@+id/imageView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:paddingTop="@dimen/nav_header_vertical_spacing"
Android:src="@Android:drawable/sym_def_app_icon" />

Ich gab das LinearLayout und die ID in nav_header_main.xml (in meinem Fall habe ich 'navigation_header_container' gewählt), also ging es so:

LinearLayout lV = (LinearLayout) findViewById(R.id.navigation_header_container);

    ivCloseDrawer = (ImageView) lV.findViewById(R.id.imageView);
    ivCloseDrawer.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            drawer.closeDrawer(GravityCompat.START);
        }
    });

Hinweis: Vor OnCreate (MainActivity) wurde oben eine private ImageView-Komponente ivCloseDrawer deklariert.

Es hat gut funktioniert! Ich hoffe es hilft.... Beste Grüße.

1
Heitor

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

BEARBEITEN: Funktioniert mit der Designbibliothek bis 23.0.1, funktioniert aber nicht mit 23.1.0

Im XML-Hauptlayout haben Sie NavigationView definiert. Verwenden Sie app:headerLayout, um die Kopfansicht festzulegen. 

<Android.support.design.widget.NavigationView
        Android:id="@+id/navigation_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        app:headerLayout="@layout/nav_drawer_header"
        app:menu="@menu/navigation_drawer_menu" />

Und der @layout/nav_drawer_header wird der Platzhalter für das Bild und die Texte sein.

nav_drawer_header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="170dp"
Android:orientation="vertical">

<RelativeLayout
    Android:id="@+id/headerRelativeLayout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <ImageView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:scaleType="fitXY"
        Android:src="@drawable/background" />

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="@dimen/action_bar_size"
        Android:layout_alignParentBottom="true"
        Android:layout_alignParentLeft="true"
        Android:layout_alignParentStart="true"
        Android:background="#40000000"
        Android:gravity="center"
        Android:orientation="horizontal"
        Android:paddingBottom="5dp"
        Android:paddingLeft="16dp"
        Android:paddingRight="10dp"
        Android:paddingTop="5dp">

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_marginLeft="35dp"
            Android:orientation="vertical"
            Android:weightSum="2">


            <TextView
                Android:id="@+id/navHeaderTitle"
                Android:layout_width="wrap_content"
                Android:layout_height="0dp"
                Android:layout_weight="1"
                Android:textAppearance="?android:attr/textAppearanceMedium"
                Android:textColor="@Android:color/white" />

            <TextView
                Android:id="@+id/navHeaderSubTitle"
                Android:layout_width="wrap_content"
                Android:layout_height="0dp"
                Android:layout_weight="1"
                Android:textAppearance="?android:attr/textAppearanceSmall"
                Android:textColor="@Android:color/white" />

        </LinearLayout>

    </LinearLayout>
</RelativeLayout>
</LinearLayout>

In Ihrer Hauptklasse können Sie Imageview und TextView wie normale andere Ansichten behandeln.

TextView navHeaderTitle = (TextView) findViewById(R.id.navHeaderTitle);
navHeaderTitle.setText("Application Name");

TextView navHeaderSubTitle = (TextView) findViewById(R.id.navHeaderSubTitle);
navHeaderSubTitle.setText("Application Caption");

Hoffe das hilft.

0
Kavin Prabhu
   FirebaseAuth firebaseauth = FirebaseAuth.getInstance(); 

   NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);   //displays text of header of nav drawer.
    View headerview = navigationView.getHeaderView(0);

    TextView tt1 = (TextView) headerview.findViewById(R.id.textview_username);
    tt1.setText(firebaseauth.getCurrentUser().getDisplayName());//username of logged in user.  

   TextView tt = (TextView) headerview.findViewById(R.id.textView_emailid);
    tt.setText(firebaseauth.getCurrentUser().getEmail());    //email id of logged in user.

    final ImageView img1 = (ImageView) headerview.findViewById(R.id.imageView_userimage);
    Glide.with(getApplicationContext())
            .load(firebaseauth.getCurrentUser().getPhotoUrl()).asBitmap().atMost().error(R.drawable.ic_selfie_point_icon)   //asbitmap after load always.
            .into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    img1.setImageBitmap(resource);
                }
            });

Ich habe diesen Code mit etwas Logik von mir selbst erstellt ... Seine Funktion läuft zu 100% ..... pls hat meine Ansage bestätigt.

Die Textansicht und die Bildansicht stammen aus @ layout/nav_header_main.xml

0
Prince_Prajwal

Sie können auch Kotlinx-Funktionen verwenden

val hView = nav_view.getHeaderView(0)
hView.textViewName.text = "lorem ipsum"
hView.imageView.setImageResource(R.drawable.ic_menu_gallery)
0
Mete