Material Design初露鋒芒之復(fù)雜視圖輕松實(shí)現(xiàn)

為什么一定要學(xué)習(xí)Material Design?

許多程序員有這樣的疑問:現(xiàn)有的知識(shí)能滿足工作需要了,為什么還要費(fèi)勁去學(xué)習(xí)Material Design?
那么我可以告訴你,Material Design大大節(jié)約了UI上的開發(fā)時(shí)間,而學(xué)會(huì)她(滿足日常使用)只需花一點(diǎn)點(diǎn)功夫。

好了,讓我們集中注意力開始學(xué)習(xí)吧~

本文要點(diǎn)

  • 保持ViewPager中Fragment的狀態(tài)。
  • 快速綁定已有數(shù)據(jù)的TabLayout與ViewPager。
  • 在Fragment中顯示標(biāo)題欄,并為該標(biāo)題欄添加菜單。
  • Fragment嵌套Fragment。
  • 一行代碼解決RecyclerView等視圖的滾動(dòng)沖突。
  • 為Fragment中的頭部視圖(含圖片)實(shí)現(xiàn)沉浸式。
  • 最簡(jiǎn)單的沉浸式?版本適配。

一個(gè)奇怪的需求

有這樣一個(gè)需求:

  • MainActivity里有一個(gè)ViewPager,ViewPager里面有三個(gè)Fragment,各個(gè)Fragment標(biāo)題欄是不一樣。
  • 第一個(gè)Fragment需要有一個(gè)帶菜單的沉浸式頭部視圖(帶圖片)以及一個(gè)ViewPager,該ViewPager包含兩個(gè)子Fragment。
  • 子Fragment內(nèi)包含帶下拉刷新的RecyclerView,該RecyclerView滑動(dòng)的時(shí)候,父Fragment里的沉浸式頭部也要跟著收起或拉伸。

傳統(tǒng)解決方案

傳統(tǒng)解決方案主要需要解決這些問題:
1.頭部圖片與標(biāo)題欄的伸縮協(xié)調(diào);
2.標(biāo)題欄與狀態(tài)欄的沉浸式協(xié)調(diào)及版本適配;
3.滾動(dòng)視圖的事件沖突。

別看只有三個(gè)主要問題,但每個(gè)問題都?jí)蚰銓懸淮蠖训倪壿嫶a了。
美團(tuán)實(shí)現(xiàn)了比這簡(jiǎn)單的功能。


美團(tuán)使用傳統(tǒng)方案部分實(shí)現(xiàn)

美團(tuán)的這個(gè)頁(yè)面是一個(gè)單獨(dú)的Activity,無(wú)需解決Fragment標(biāo)題欄與沉浸式的問題。然而美團(tuán)并沒有實(shí)現(xiàn)沉浸式,多次拖拉還會(huì)出現(xiàn)滑不動(dòng)的情況。不過,功能是實(shí)現(xiàn)了,也還算流暢吧,那么還有更好的解決方案嗎?

使用Material控件完美解決

話不多說,獻(xiàn)上Demo: MaterialShow。
使用Material控件可以非常優(yōu)雅地消滅各種問題,幾乎不需要寫任何邏輯代碼。

如絲般順滑,性能杠杠的~往下繼續(xù)查看要點(diǎn)解讀。

使用Martial Design優(yōu)雅實(shí)現(xiàn)

要點(diǎn)解讀

// 保存ViewPager中Fragment的狀態(tài)
mViewPager.setOffscreenPageLimit(mFragments.size());
// 在Fragment中顯示標(biāo)題欄,并為該標(biāo)題欄添加菜單。
mToolbar.inflateMenu(R.menu.main); 
mToolbar.setOnMenuItemClickListener(this);
// 快速綁定已有數(shù)據(jù)的TabLayout與ViewPager。
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
mTabLayout.addOnTabSelectedListener(this);
// Fragment中ViewPager嵌套Fragment,需要注意傳入的FragmentMangager(),不然子Fragment可能無(wú)法顯示。
mViewPager.setAdapter(new FragmentStatePagerAdapter(getChildFragmentManager()...
// 一行代碼解決RecyclerView等視圖的滾動(dòng)沖突,具體請(qǐng)看[源碼](https://github.com/XunMengWinter/MaterialShow/tree/master) 。
app:layout_behavior="@string/appbar_scrolling_view_behavior"
// 為Fragment中的頭部視圖(含圖片)實(shí)現(xiàn)沉浸式。

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="lollipop">true</item>
    <item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent    </item>
</style>
// 為該Fragment所在的Activity設(shè)定該主題,會(huì)帶來一些輸入框問題,但是由于AppBar是在Fragment里面,如果在Activity里面的話直接設(shè)定為上面的主題就可以實(shí)現(xiàn)頭部圖片沉浸式了。
<style name="AppTheme.NoActionBar.Immerse">
    <item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
</style>
// 最簡(jiǎn)單的沉浸式?版本適配,請(qǐng)看源碼。

// 為ToolBar設(shè)置MarginTop.
android:layout_marginTop="@dimen/height_status_bar"
//在 dimen.xml 文件中添加
<dimen name="height_status_bar">0dp</dimen>
//在 dimen.xml(v19) 文件中添加
<dimen name="height_status_bar">22dp</dimen>

// p.s 這樣一來安卓4.4以上toolbar就距離頂部22dp了,而比4.4低的版本是沒有沉浸式這一概念的,所以設(shè)為0dp就好。

再來喵一眼,順便點(diǎn)個(gè)喜歡關(guān)注什么的~~


Material Design各個(gè)控件?自動(dòng)協(xié)調(diào)

相關(guān)鏈接

本文Demo
30分鐘入門Android Material Design

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容