ANDROID – Navigation Drawer 中取出 HeaderView 的議題

在 Android 官方所發佈的 design support library 中,提供了諸多讓開發者方便寫出 Material Design (實感設計) 的元件。而其中 Navigation Drawer 更提供了相當便利的寫法,只要帶入 menu 以及 header layout 就可以開發出像標準文件中所提出來的樣示。

android_navigation_drawer_part

在新版的開發工具中,更是提供了很方便的樣版,選擇好開發樣式後,android_new_navigation_drawer_activity

會自動產生出如下圖中,需要在 navigation drawer 中所需要用到的相對應檔案,

android_navigation_drawer_layout_files

在 Navigation Drawer 裡面為設定了 headerLayout 以及 menu 兩個屬性,

android_navigation_drawer_headerlayout_attr

在介面上,側邊欄的上方便會帶出 header layout 所設定的畫面;下方則是以分群列表的樣版,將 menu 裡面的文字、圖示呈現出來。

Design Support Library 23.1.0 以前


可是,在 23版時似乎發生了一點狀況,無法直接用 findViewById 將 header layout 裡的元件帶出來設定,取出來的東西會為空。不過,說實話,詳細是從哪個版本開始出現這個狀況,自己也沒特別留意到 XD

android_navigation_drawer_header_nullable
在這種狀況下,header layout 就變成只能當作靜態 layout 在使用,也就是不能改變其中的值了。所以,接下來就直接說明,如果使用官方提供樣版範本在撰寫的話,要怎麼取得 header layout 裡的東西。

以官方提供的樣版程式結構為例
首先,請先將  activity_main.xml 中, NavigationView 元件裡的 headerLayout 這個屬性拿掉:

再來看到 MainActivity.java 裡,在 NavigationView 的宣告之後,使用其中的函式 inflateHeaderView(R.layout.your_layout_name) ,取出 header layout 的 view:

先看到下圖,官方在 nav_header_main.xml 這個介面裡,其程式碼所對應到的介面:

android_navigation_drawer_layout_define

接下來,要改其中的 @+id/textView 的內容,就只拿宣告好的變數 header  去 findViewById 將元件帶出來,設定其值即可。此片段的完整程式碼如下:

 

碎碎唸時間

其實,在 NavigationView 這個物件的原始碼裡面,是有將 headerLayout 這個屬性物件,用函式 addHeaderView 將之放入其中。可是,不知道為什麼,不再多提供一個函式,讓開發者直接取出 header view 的物件出來使用就好了 ~”~

 

Design Support Library 23.1.1 以後


看來,在 2015/11 所發佈的 23.1.1 中,在 NavigationView 裡增加了兩個函式讓開發者可以順利取得嘍。

撰文的當下,官方文件還未有說明,所以連結就先全部帶往 NavigationView 的說明頁面嘍 XD

1. NavigationView.getHeaderCounter()

取得 NavigationView 中的 header 數,若是在 layout 的標籤 headerLayout 已設定了 Header Layout,這邊就不會為 0,那也就可以直接在使用下一個函式,來取得 Header View。

2. NavigationView.getHeaderView(int index)

從原始碼中,我們其實可以看到 header view 在 navigation view 裡,其實就是用動態加入的方式增加。所以,官方在新的 library 版本中,提供了這個函式,讓開發者取出 Header View 來自行使用。

所以,若是在 NavigationView 的  layout 標籤中,用 headerLayout 來設定的話,那就可以直接取出 index 0 的 view 來使用了。

若是要嚴謹一點,那就是再用 getHeaderCounter() 來避免發生空值的狀況。

Loading Facebook Comments ...

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *