webentwicklung-frage-antwort-db.com.de

NavigationView-Header-Layout abrufen / suchen

In meiner Navigationsansicht habe ich ein Header-Layout mit der ID 'viewId' mit aktiven Schaltflächen. Um diese Schaltflächen einzurichten, gehe ich in der Aktivität onPostCreate wie folgt vor:

final View panel = findViewById(R.id.viewId);
panel.setOnClickListener(new View.OnClickListener() {
... setup goes here ...
});

Mit der neuen Version Android support library, (23.1.) kann die Ansicht nicht gefunden werden, sie gibt null zurück. Mit früheren Versionen hat es gut funktioniert Wenn ja, wie kann ich auf das Header-Layout zugreifen und es verhalten?

160
khusrav

In Version 23.1.0 wird NavigationView auf die Verwendung von RecyclerView (anstelle des vorherigen ListView) umgestellt, und der Header wird als eines dieser Elemente hinzugefügt. Dies bedeutet, dass es nicht sofort verfügbar ist, findViewById() aufzurufen - ein Layout-Durchlauf ist erforderlich, bevor er an NavigationView angehängt wird.

Für Version 23.1.1 der Support Library können Sie jetzt mit getHeaderView() einen Verweis auf die Header-Ansicht erhalten:

View headerLayout = navigationView.getHeaderView(0); // 0-index header

Dies hat den Vorteil, dass über XML und über Code hinzugefügte Header bearbeitet werden können.

Wenn Sie immer noch 23.1.0 verwenden, gemäß dem zugehörigen Fehler , können Sie den Header im Code aufblasen und findViewById() dafür verwenden:

View headerLayout = 
    navigationView.inflateHeaderView(R.layout.navigation_header);
panel = headerLayout.findViewById(R.id.viewId);
// panel won't be null

Bis Sie zu 23.1.1 wechseln.

408
ianhanniballake

Ab der Version 23.1.1 der Design-Support-Bibliothek können Sie diese jetzt verwenden

NavigationView navigationView = (NavigationView) findViewById(R.id.your_nav_view_id);
View header = navigationView.getHeaderView(0)
TextView text = (TextView) header.findViewById(R.id.textView);
136
Francois Dermu

So habe ich es mit ButterKnife gemacht und es funktioniert für mich.

protected static class HeaderViewHolder {

    @BindView(R.id.button)
    Button button;

    HeaderViewHolder(View view) {
        ButterKnife.bind(this, view);
    }
}

und dann diesen Ansichtshalter wie folgt verwenden:

View header = navigationView.getHeaderView(0);
headerViewHolder = new HeaderViewHolder(header);
12
Wahib Ul Haq

Für mich war das die selbe Situation mit 23.1.0, nach dem Update wurde die Nullzeiger Ausnahme. In diesem Fall sieht das NavigatorView folgendermaßen aus:

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

Ich habe den Lösungsvorschlag von ianhanniballake ausprobiert, aber er funktioniert nicht. Dann habe ich mit dem Satz aufgeblasen:

LayoutInflater.from(getContext()).inflate(R.layout.nav_header, mNavigationView);

Danach kann ich anhand der ID alle im nav_heard - Layout definierten Ansichten finden.

8
Campino
NavigationView navigationView = findViewById(R.id.your_nav_view);
View header = navigationView.getHeaderView(0);
TextView textUsername = header.findViewById(R.id.textView);
textUsername.setText("you text here ");
2
indrit saveta