Başlık düzenini al / bul


171

NavigationView uygulamamda, aktif düğmeleri olan 'viewId' kimliğine sahip bir başlık düzenim var. Bu düğmeleri ayarlamak için etkinliklerde aşağıdakileri yaparım onPostCreate:

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

Yeni sürüm android destek kütüphanesi ( 23.1.0 ) ile görünüm bulunamıyor, null döndürüyor. Önceki sürümlerle iyi çalıştı. Bir hata mı yoksa bu özelliği yanlış mı kullanıyorum? Öyleyse, başlık düzenine nasıl erişilir ve buna nasıl davranış eklenir?

Yanıtlar:


429

Sürüm 23.1.0 NavigationView, a RecyclerView(öncekinden ziyade) kullanmaya geçer ListViewve başlık bu öğelerden biri olarak eklenir. Bu, çağrı yapmak için hemen kullanılamadığı anlamına gelir findViewById()- bir yerleşim pastasına eklenmeden önce gereklidir NavigationView.

İçin sürümü 23.1.1 Destek Kütüphanesi, artık kullanarak başlık görünümüne başvuru alabilirsiniz getHeaderView():

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

Bunun avantajı, XML ve kod yoluyla eklenen başlıklarda çalışma avantajıdır.

23.1.0'ı hala ilgili hataya göre kullanıyorsanız , üstbilgiyi kodda şişirebilir ve findViewById()üzerinde kullanabilirsiniz :

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

23.1.1'e geçene kadar.


1
Hızlı yardım için teşekkürler, geçici çözümü kullanacaktır. Adanmış yönteme sahip olmak için bir yol var gibi görünüyor, umarım gelecekteki sürümlerde olacak.
khusrav

2
@AlexanderFarber - Gönderdiğim kod API 7'ye geri dönüyor
ianhanniballake

4
Kütükleri düşürmeyi tercih ederim. Bir hata tanıtmak Google'ın imzası gibidir. Yeni sürümde bir hata varsa, Google bu yeni sürümü yayınladı
BamsBamx

1
@GFPF - aradığınızda inflateHeaderView, Görünüm'ü sizin RecyclerViewiçin doğru üst öğeyle doğru katmana ekler - harici olarak yapamayacağınız bir şey NavigationView.
ianhanniballake

1
@RmK - teşekkürler, XML aracılığıyla eklenen üstbilgileri almak için 23.1.1'de eklenen yeni API'leri yansıtmak üzere yanıt verdim (önceki geçici çözüm yalnızca kodla eklenen üstbilgilerde çalıştı).
ianhanniballake

142

Şimdi tasarım destek kütüphanesinin 23.1.1 sürümü ile şunları kullanabilirsiniz:

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

navigationView.getHeaderCount()Herhangi bir nedenle 1'den fazla başlığınız olması durumunda da kullanabilirsiniz .
Francois Dermu

13

Bu şekilde yaptım ButterKnifeve benim için çalışıyor.

protected static class HeaderViewHolder {

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

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

ve bu görünüm tutucuyu şu şekilde kullanın:

View header = navigationView.getHeaderView(0);
headerViewHolder = new HeaderViewHolder(header);

2
Etkinlikle ilgili mantığı görüntüle'yi kaldırmak istediğinizde mükemmeldir. İyi fikir!
amouly

2
ButterKnife ile mükemmel çalışıyor, teşekkürler kardeşim.
Rajesh Naddy

8

Benim için 23.1.0 ile aynı durum, güncellemeden sonra boş işaretçi istisnası haline gelir. Bu durumda NavigatorViewşöyle görünür:

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

Ianhanniballake'in çözüm önerisini denedim ama işe yaramıyor. Sonra cümle ile şişirdim:

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

Bundan sonra, nav_hearddüzende tanımlanan tüm görünümleri kimliğe göre bulabilirim .


3
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 ");

Merhaba ve Stack Overflow'a hoş geldiniz! Lütfen bunun yukarıda sorulan soruyu nasıl çözdüğünü açıklayan bir metin ekleyin. Teşekkürler!
Jonathan

0

Kotlin @Francois Dermu kodu gibi olmak

val navigationView : NavigationView = findViewById(R.id.your_nav_view_id);
val header = navigationView.getHeaderView(0)
val textView = header.findViewById<TextView>(R.id.textView)

0

Kotlin versiyonu.

val navView: NavigationView = findViewById(R.id.nav_view)       
// set User Name
val headerView: View = navView.getHeaderView(0)
headerView.txtUserName.text = "User Name Goes here"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.