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?
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);
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);
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 !.
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);
es ist ein Fehler bei 23.1.0
23.1.1 behoben
https://plus.google.com/+AndroidDevelopers/posts/ebXLByBiEBU