web-dev-qa-db-de.com

Anpassen von NavigationView - Hinzufügen dynamischer HeaderView, Android Support Design Library

Ich habe die Navigationsansicht aus der neuen Android-Supportdesign-Bibliothek ausprobiert. Ich möchte eine dynamische Übersicht haben. Im Grunde zeigt mein Kopfüberblick so etwas wie ein Zitat des Tages. Ich habe ungefähr 10 Anführungszeichen und möchte zufällig ein Zitat auswählen und in einer Textansicht in der Headeransicht anzeigen. Ich möchte auch die onClick-Methode für die headerView hinzufügen.

Momentan sehe ich keine Möglichkeiten, das Layout der Kopfübersicht programmgesteuert zu ändern. Anregungen zur Umsetzung?

20
Abdul Rahman

erstellen Sie zunächst XML-Header wie lay_header.xml

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

aufblasen Sie in Ihrer Java-Datei diesen obigen Header in einer TextView. mögen

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

Fügen Sie es jetzt als HeaderView hinzu

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

Das ist es...

24
Moinkhan

Nach dem neuen Support Library Update (23.1.1)

Sie könnten das tun -

Fügen Sie die Kopfübersicht in der Navigationsansicht in app:headerLayout="@layout/drawer_header" hinzu.

Dann können Sie darauf zugreifen, indem Sie 

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

oder wenn Sie mehrere Header haben

navigationView.getHeaderCount()

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

header-Layout erstellen Textansicht nach innen übernehmen,

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

in onCreate,

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

erstellen Sie die Methode onSelectText in Ihrer Aktivität

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

Mit findViewById() können Sie auf Header-Elemente in der NavigationView zugreifen. Dies funktioniert auch, wenn Sie den Header mit der Eigenschaft headerLayout initialisiert haben, z. app:headerLayout="@layout/drawer_header". Sie können dann den Header dynamisch ändern, ohne dass Sie einen neuen Header hinzufügen oder hinzufügen müssen. 

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

drawer_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">
...

Ich glaube, Dhawal sagt dasselbe, aber es war nicht sehr klar.

1
Jarrod Smith

Sie können Ihren benutzerdefinierten Header programmgesteuert hinzufügen, indem Sie addHeaderView in Ihrer navigationView aufrufen oder ihn in der Layoutdatei mit app:headerLayout="@layout/myheader" definieren.

1
Vera Rivotti

Zuerst müssen Sie die navigationView .NavigationView navigationView =(NavigationView)findViewById(R.id.nav_view); bekommen.

Dann header .View header = navigationView.getHeaderView(0) Dann textView .TextView text = (TextView) header.findViewById(R.id.textView); Schließlich können Sie den anzuzeigenden Text einstellen .text.setText("Hello there");

0
Misho Zhghenti

Mein Link wird Ihnen helfen

schlankere Frage

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