it-swarm.com.de

Android-Unterstützung für v23.1.0-Update unterbricht den Header von NavigationView get/find

Ich habe die v23.0.1 -Bibliothek bisher ohne Probleme verwendet. Wenn ich nun zur neuen Bibliothek v23.1.0 wechsle, erhalte ich einen Nullzeiger auf Widgets im Schubladenlayout.

mNavigationView = (NavigationView) findViewById(R.id.navigation_view);    
TextView username = (TextView) mNavigationView.findViewById(R.id.username_textView);
//       ^^^^^^^^ is now null when using new library
// which causes the following to fail
username.setText(mUser.getName());

Aktivitätslayout

<?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"
    tools:context=".MainActivity">

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">

    <include layout="@layout/toolbar" />

    ...

</LinearLayout>

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

</Android.support.v4.widget.DrawerLayout>

drawer_header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:fresco="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="150dp"
Android:orientation="vertical">

   <TextView
    Android:id="@+id/username_textView"
    Android:layout_width="match_parent"
    Android:layout_height="0dp" />

    ...

</LinearLayout>

Wenn Sie einfach die Gradle-Datei ändern, um die ältere Version zu verwenden, funktioniert sie sofort einwandfrei. Ich habe die Revisionen im Update durchgecheckt und nichts gesehen, was ich für dieses Problem halten würde.

Sicherlich wird dies auch andere betreffen, irgendwelche Hinweise?

29
Breavyn

Mit der Design-Bibliothek v 23.1.0 arbeitet die NavigationView mit einer RecyclerView.
Auch die Header ist jetzt eine Art Zeile. 

Dies bedeutet, dass der Header in der Ansichtshierarchie nicht sofort verfügbar sein konnte.
Es kann Probleme verursachen, wenn Sie Methoden wie navigationView.findViewById(XXX) verwenden, um eine Ansicht in den Header zu erhalten.

Es gibt einen Fehler im Google Tracker

EDIT 12/10/2015: Design Bibliothek 23.1.1

In 23.1.1 wird eine neue API zum Abrufen von Header-Ansichten für NavigationView mit getHeaderView () eingeführt.

VOR 23.1.1

workaround für 23.1.0 kann die Verwendung einer addOnLayoutChangeListener sein. Somenthing wie:

navigationView.addOnLayoutChangeListener( new View.OnLayoutChangeListener()
{
    @Override
    public void onLayoutChange( ... )
    {
        navigationView.removeOnLayoutChangeListener( this );

        View view = navigationView.findViewById( ... );
    }
} );

Eine andere mögliche Problemumgehung ist:

  • entfernen Sie das app:headerLayout-Attribut aus der XML-Datei und fügen Sie den Header programmgesteuert hinzu.

  • Blasen Sie die HeaderView programmgesteuert auf.

Verwenden Sie etwas wie dieses:

View headerLayout = navigationView.inflateHeaderView(R.layout.navigation_header);
headerLayout.findViewById(xxx);
41

Es scheint, dass das Anhängen der Kopfansicht an die Navigationsleiste mithilfe von xml derzeit unterbrochen ist. Die Lösung besteht darin, die Ansicht manuell aufzublasen und anzubringen.

Aktivitätslayout

<Android.support.design.widget.NavigationView
    Android:id="@+id/navigation_view"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:fitsSystemWindows="true"
    app:headerLayout="@layout/drawer_header" <!-- remove this line -->
    app:menu="@menu/drawer_items" />

Dann blähen Sie den Code in Ihrem Code auf und befestigen Sie ihn wie folgt.

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);
View drawerHeader = navigationView.inflateHeaderView(R.layout.drawer_header);

TextView username = (TextView) drawerHeader.findViewById(R.id.username_textView);
11
Breavyn

in der neuen NavigationView ist der Header jetzt ein Zeilentyp von RecyclerView. Damit Sie oder jemand die view anhand ihrer id finden können, müssen Sie sie umgehen und den addOnLayoutChangeListener Listener verwenden. Dann finden Sie die view. Ich weiß, dass sie dokumentiert werden sollte irgendwo aber Android sei wie meh !. 

0
k0sh

Ich habe Build-Tools von Android SDK-Manager aktualisiert, dann funktioniert 23.1.0 auch für mich. 

Ich benutze

buildToolsVersion "23.0.2"

davor war es 23.0.1. 

und es gibt keine Notwendigkeit zu verwenden 

(View)navigationView.findViewById(R.id.idOfViewFromHeaderView);

In Ihrer Aktivität können Sie direkt verwenden 

(View)findViewById(R.id.idOfViewFromHeaderView);
0
Muhammad Adil

es ist ein Fehler bei 23.1.0

23.1.1 behoben

https://plus.google.com/+AndroidDevelopers/posts/ebXLByBiEBU

0
xushao