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.