it-swarm.dev

Android desteği v23.1.0 güncelleme sonları NavigationView almak/başlık bulmak

Şu ana kadar v23.0.1 destek kütüphanesini şimdiye kadar sorunsuz bir şekilde kullanıyorum. Şimdi yeni v23.1.0 kütüphanesine geçtiğimde, çekmece düzenindeki aletler üzerinde boş bir işaretçi görüyorum.

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());

etkinlik düzeni

<?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>

Eski sürümü kullanmak için basitçe gradle dosyasını değiştirmek anında iyi çalışmasını sağlar, böylece kodumda çok yanlış bir şey olduğunu sanmıyorum. Güncellemedeki revizyonları kontrol ettim ve buna neden olacağını düşündüğüm hiçbir şey görmedim.

Elbette bu başkalarını da etkileyecek, herhangi bir ipucu?

29
Breavyn

V 23.1.0 tasarım kütüphanesi ile NavigationView, RecyclerView ile çalışır.
Ayrıca Header artık bir satır türüdür. 

Bu, başlığının görünüm hiyerarşisinde hemen kullanılamayacağı anlamına gelir.
Başlık içinde bir görünüm elde etmek için navigationView.findViewById(XXX) gibi yöntemler kullanıyorsanız sorunlara neden olabilir.

Google Tracker 'da bir hata var. 

EDIT 12/10/2015: Tasarım kütüphanesi 23.1.1

23.1.1 getHeaderView () ile NavigationView için başlık görünümlerini almak için yeni bir API sunar

ÖNCE 23.1.1

geçici çözüm fot 23.1.0addOnLayoutChangeListener kullanmak olabilir. Gibi bir şey:

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

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

Başka bir olası geçici çözüm:

  • app:headerLayout niteliğini xml'den kaldırın ve sonra başlığı programatik olarak ekleyin.

  • HeaderView'ı program aracılığıyla şişirin.

Böyle bir şey kullanın:

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

Başlık görünümünü, xml kullanarak gezinme çekmecesine takarken görünmektedir. Çözüm, görünümü manuel olarak şişirmek ve eklemek.

etkinlik düzeni

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

Ardından kodunuzda şişirin ve aşağıdakileri yaparak başlığı ekleyin.

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

yeni NavigationView içinde başlık, artık sizin veya herkesin RecyclerViewview' ı bulması için sıralı bir id türüdür: addOnLayoutChangeListenerview kullanarak bulmanız gerekir. bir yerlerde ama Android meh gibi olun !. 

0
k0sh

Android sdk yöneticisinden derleme araçlarını güncelledim, daha sonra 23.1.0 da benim için çalışıyor. 

Ben kullanıyorum

buildToolsVersion "23.0.2"

bundan önce 23.0.1 oldu. 

ve kullanmaya gerek yok 

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

Faaliyetinizde doğrudan kullanabilirsiniz 

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