Dans Android comment définir l’image d’en-tête de tiroir de navigation et nommer par programme dans le fichier de classe?

Dans android studio 1.4.1, j’ai créé un nouveau projet de tiroir de navigation qui est default. Mon problème concerne ce projet. Je veux que cette image et le nom soient définis par programme dans mon activité principale. Comment faire cela, j’ai essayé beaucoup mais l’application se bloque.

nav_header_main.xml

      

activity_main.xml

      

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.ssortingng.navigation_drawer_open, R.ssortingng.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; } } 

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

J’espère que cette aide!

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

Une solution consiste à gonfler la vue principale par programme et à rechercher la vue par ID dans la vue d’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 sa publication dans la version de la bibliothèque du support de conception.

N’ajoutez pas d’en-tête dans xml add en utilisant le 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"); 

Voici mon code ci-dessous qui fonctionne parfaitement Ne pas append l’en-tête dans la balise NavigationView dans activity_main.xml

   

append un en-tête par programmation 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"); 
  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); Ssortingng photoUrl = prefs.getSsortingng("photo_url", null); Ssortingng user_name = prefs.getSsortingng("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.

Je sais que c’est un ancien message, mais je suis sûr que cela pourrait aider quelqu’un sur la route.

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.

C’est et ancien message, 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 ImageView de l’exemple, répertorié ci-dessous. Attention: c’est le même code que vous obtenez lorsque vous démarrez un nouveau projet et choisissez le modèle “Activité du tiroir de navigation”:

  

J’ai donné le LinearLayout et l’ID, à l’intérieur de nav_header_main.xml (dans mon cas, j’ai choisi ‘navigation_header_container’, c’est 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); } }); 

Note: J’ai une imageView ivCloseDrawer privée déclarée en haut, avant onCreate (MainActivity).

Ça a bien marché! J’espère que ça aide, Cordialement.

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

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

Ensuite, vous devez supprimer la disposition des en-têtes du fichier activity_main.xml car la mise en page sera gonflée par programme dans MainActivity. Votre activity_main.xml devrait ressembler à ceci:

      

Ensuite, dans votre MainActivity, on gonfle la mise en page nav_header_main et on accède à 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

EDIT: Fonctionne avec la bibliothèque de conception jusqu’à 23.0.1 mais ne fonctionne pas avec 23.1.0

Dans la mise en page principale XML, NavigationView sera défini, dans cette app:headerLayout utilisez app:headerLayout pour définir la vue d’en-tête.

  

Et la @layout/nav_drawer_header sera la place de l’image et des textes.

nav_drawer_header.xml

             

Et dans votre classe principale, vous pouvez prendre la poignée de Imageview et TextView comme d’autres 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.

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

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