web-dev-qa-db-fra.com

Personnalisation de NavigationView - Ajout d’en-tête dynamique, bibliothèque de conception de support Android

J'ai essayé la navigationView à partir de la nouvelle bibliothèque de conception de support Android. Je veux avoir une tête dynamique. Fondamentalement, mon aperçu va montrer quelque chose comme une citation du jour. J'ai comme environ 10 citations et je veux choisir au hasard une citation et l'afficher dans un textview dans l'en-tête. Je veux aussi ajouter la méthode onClick pour la headerView.

À l'heure actuelle, je ne vois aucune possibilité de changer la disposition de la tête par programme. Des suggestions pour implémenter ceci?

20
Abdul Rahman

créez d'abord un en-tête XML comme lay_header.xml

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

sur votre fichier Java, gonflez cet en-tête ci-dessus dans un TextView. comme

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

Maintenant, ajoutez-le en tant que HeaderView

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

C'est tout...

24
Moinkhan

Après la nouvelle mise à jour de la bibliothèque de support (23.1.1),

Tu pourrais faire ça -

Ajoutez l’aperçu dans le app:headerLayout="@layout/drawer_header" de NavigationView.

Ensuite, vous pouvez y accéder par, 

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

ou si vous avez plusieurs en-têtes

navigationView.getHeaderCount()

Réf.: https://code.google.com/p/Android/issues/detail?id=190226#c31

14
RmK
TextView txt2;
txt2 = (TextView) navigationView.inflateHeaderView(R.layout.nav_header_main).findViewById(R.id.textView2);
txt2.setText("wow! It works like a charm");
6
Shwarz Andrei

enter image description here

créer une disposition d'en-tête prend la vue du texte à l'intérieur,

<TextView
                Android:id="@+id/profile_email_text"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@id/profile_image"
                Android:layout_alignParentBottom="true"
                Android:layout_toLeftOf="@id/expand_account_box_indicator"
                Android:ellipsize="end"
                Android:maxLines="1"
                Android:paddingBottom="16dp"
                Android:singleLine="true"
                Android:clickable="true"
                Android:onClick="onSelectText"
                Android:text="[email protected]"
                Android:textColor="@color/body_text_2_inverse"
                Android:textSize="@dimen/text_size_medium" />

dans onCreate,

((TextView) findViewById(R.id.profile_email_text)).setText("test");

créer la méthode onSelectText dans votre activité

public void onSelectText(View v){
        if(v.getId() == R.id.profile_email_text){
            Snackbar
                    .make(fab, "clicked on sub title", Snackbar.LENGTH_LONG)
                            //.setAction(R.string.snackbar_action, myOnClickListener)
                    .show();
            drawer_layout.closeDrawers();
        }
    }
2

Vous pouvez utiliser findViewById() pour accéder aux éléments d’en-tête dans NavigationView. Cela fonctionne même si vous avez initialisé l'en-tête avec la propriété headerLayout, par exemple. app:headerLayout="@layout/drawer_header". Vous pouvez ensuite modifier dynamiquement l'en-tête sans avoir à gonfler ou ajouter un nouvel en-tête. 

@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {

...

if(mNavItemId == R.id.drawer_item_1)
{
  View headerView = mNavigationView.findViewById(R.id.drawer_header_root);
  // Test modifying the size of the header root element (FrameLayout)
  // when the first menu item is clicked.
  LinearLayout.LayoutParams p = (LinearLayout.LayoutParams) headerView.getLayoutParams();
  p.height = p.height == 700 ? 400 : 700;
  headerView.setLayoutParams(p);
  return true;
}
...

tiroir_header.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="196dp"
Android:background="@color/drawer_header_bg"
Android:orientation="vertical"
Android:id="@+id/drawer_header_root">
...

Je pense que Dhawal dit la même chose, mais ce n'était pas très clair.

1
Jarrod Smith

Vous pouvez ajouter votre en-tête personnalisé par programme en appelant addHeaderView sur votre navigationView ou le définir dans le fichier de présentation à l'aide de app:headerLayout="@layout/myheader".

1
Vera Rivotti

Mon être ce lien va vous aider

question plus mince

final NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);

View headView = navigationView.getHeaderView(0);

((TextView) headView.findViewById(R.id.nav_title)).setText("New title");
0
Bikesh M Annur