web-dev-qa-db-fra.com

Dans Android, comment définir l'image d'en-tête du tiroir de navigation et le nom par programme dans un fichier de classe?

Dans Android studio 1.4.1, j'ai créé un nouveau projet de tiroir de navigation (par défaut). Mon problème est dans ce projet. Il existe un fichier nav_header_main.xml destiné à l'image et au nom de l'en-tête de navigation. Je souhaite que cette image et ce nom soient définis par programme dans l'activité principale de la classe. Comment faire cela, j'ai essayé beaucoup mais l'application se bloque.

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

espérons cette aide!

193
Triệu Đô La

Comme mentionné dans le bogue 190226 , depuis la version 23.1.0, obtenir la vue de présentation d'en-tête avec: navigationView.findViewById(R.id.navigation_header_text) ne fonctionne plus.

Une solution de contournement consiste à gonfler la présentation de tête par programme et à rechercher une vue par ID à partir de la vue en-tête gonflée.

Par exemple:

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

Idéalement, il devrait y avoir une méthode getHeaderView(), mais elle a déjà été proposée. Voyons et attendons qu’elle soit publiée dans la version de fonctionnalité de la bibliothèque de support de conception.

46
Paresh Mayani

ne pas ajouter d'en-tête dans xml add en utilisant du code en gonflant la mise en page

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

Vous devez d’abord accéder au tiroir de navigation de votre MainActivity (ou de l’activité appelante) comme ceci:

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

Ensuite, vous devez supprimer la disposition d'en-tête du fichier activity_main.xml, car celle-ci sera gonflée par programme dans MainActivity. Votre activity_main.xml devrait ressembler à ceci:

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

Ensuite, dans votre MainActivity, nous gonflons la disposition nav_header_main et obtenons l'accès à ses vues, en l'occurrence ImageView et 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);

Vous pouvez en lire plus ici

4
Ikhiloya Imokhai
  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);

            }

        }
    }

J'espère que cela t'aides.

4
Saurabh Singh

Voici mon code Ci-dessous fonctionne parfaitementN'ajoutez pas l'en-tête dans NavigationView Tag dans activity_main.xml 

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

ajouter un en-tête par programme avec le code ci-dessous

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
Anirudh R.Huilgol.

À 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

Je sais que c’est un vieil article mais je suis sûr que cela pourrait aider quelqu'un au bout du chemin.

Vous pouvez simplement obtenir l'élément headerView de la vue Navigation en procédant comme suit: 

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

J'espère que cela aide quelqu'un.

2
Ronnie

C'est un vieux post, mais c'est nouveau pour moi. Donc, c'est simple! Dans cette partie du code:

 public boolean onNavigationItemSelected(MenuItem item) {

} , J'ai lié un ImageView à LinearLayout, qui contient le ImageView de l'exemple ci-dessous. Attention: c'est le même code que lorsque vous démarrez un nouveau projet et que vous choisissez le modèle "Activité du tiroir de navigation": 

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

J'ai donné le LinearLayout et l'ID, dans nav_header_main.xml (dans mon cas, j'ai choisi 'navigation_header_container', ce qui s'est passé ainsi:

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);
        }
    });

Remarque: J'ai un ivCloseDrawer ImageView privé déclaré en haut, avant onCreate (MainActivity).

Cela a bien fonctionné! J'espère que cela aide, Meilleures salutations.

1
Heitor

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

0

EDIT: Fonctionne avec les bibliothèques de conception jusqu'à 23.0.1 mais ne fonctionne pas sur 23.1.0

Dans la mise en page principale xml, vous aurez défini NavigationView. Utilisez app:headerLayout pour définir la vue de l'en-tête. 

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

Et le @layout/nav_drawer_header sera le titulaire de l’image et des textes.

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>

Et dans votre classe principale, vous pouvez manipuler Imageview et TextView comme des vues normales.

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

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

J'espère que cela t'aides.

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);
                }
            });

J'ai fait ce code par moi-même avec une certaine logique ... Son 100% de travail ..... pls faire upvote mes ans.

Textview et imageview proviennent de @ layout/nav_header_main.xml

0
Prince_Prajwal

Aussi, vous pouvez utiliser les fonctionnalités de Kotlinx

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