Material Design

MaterialDesign是一套全新的界面設(shè)計(jì)語(yǔ)言,包含視覺(jué),運(yùn)動(dòng),互動(dòng)效果等特性.

Design Support庫(kù)這個(gè)庫(kù)將Material Design中最具有代表性的一些控件和效果進(jìn)行了封裝,使得開發(fā)者在即使不了解Material Design的情況下也能非常輕松地將自己的應(yīng)用Material化.

Toolbar

Toolbar不僅繼承了ActionBar的所有功能,而且靈活性很高,可以配合其他控件來(lái)完成一些MaterialDesign的效果.

將ActionBar取消并替換成Toolbar

ActionBar由于設(shè)計(jì)原因,被限定只能在活動(dòng)的頂部,所以不能實(shí)現(xiàn)一些Material Design的效果,官方現(xiàn)在已經(jīng)不建議使用ActionBar了.ActionBar其實(shí)是根據(jù)項(xiàng)目中指定的主題來(lái)顯示的.打開AndroidManifest.xml .使用android:theme屬性指定了一個(gè)AppTheme的主題

? <application

? android:allowBackup="true"

? ? android:icon="@mipmap/ic_launcher"

? ? android:label="Fruit"

? ? android:roundIcon="@mipmap/ic_launcher_round"

? ? android:supportsRtl="true"

? android:theme="@style/AppTheme">

AppTheme主題是在res/values/styles.xml文件中定義的(as中可以直接ctrl+鼠標(biāo)左鍵來(lái)查看)

這里定義了一個(gè)叫AppTheme的主題然后指定它的parent主題是Theme.AppCompat.Light.DarkActionBar.這個(gè)DarkActionBar便是一個(gè)深色的ActionBar主題,我們之前所有項(xiàng)目中自帶的ActionBar就是因?yàn)橹付诉@個(gè)主題才出現(xiàn)的.

如果我們要使用Toolbar來(lái)代替ActionBar,因此需要指定一個(gè)不帶ActionBar的主題,通常有兩種一種是Theme.AppCompat.NoActionBar另一種是Theme.AppCompat.Light.NoActionBar.

1
2

總結(jié):將ActionBar設(shè)置成Toolbar的方法是將res/values/styles.xml文件中的parent設(shè)置一下,由之前的Theme.AppCompat.Light.DarkActionBar設(shè)置成Theme.AppCompat.NoActionBar/Theme.AppCompat.Light.NoActionBar.設(shè)置完成后會(huì)發(fā)生一個(gè)顯著的變化即AppTheme中屬性也隨之發(fā)生了變化,比如colorPrimary和colorPrimaryDark和colorAccent;當(dāng)然除了這三個(gè)屬性以外我們還可以在<style>標(biāo)簽內(nèi)設(shè)置一些其他的屬性比如:textColorPrimary.windowBackground和navigationBarColor等屬性來(lái)控制更多位置顏色.

colorAccent這個(gè)屬性不只是用來(lái)指定這樣一個(gè)按鈕的顏色,而是更多表達(dá)一種強(qiáng)調(diào)的意思,比如一些控件選中狀態(tài)也會(huì)使用colorAccent的顏色

使用Toolbar來(lái)代替ActionBar

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

打開布局文件,首先看一下的這二行代碼首先使用xmln:android來(lái)指定一個(gè)命名空間,因此我們才能一直使用android:id,android:layout_width等寫法.這里指定了xmln:app,也就是說(shuō)可以使用app:attribute這樣的寫法了,指定xmlns:app的目的在于為了兼顧Android5.0之前的那些老系統(tǒng),因?yàn)镸aterial Design是在Android5.0系統(tǒng)才出現(xiàn)的,而很多Material屬性在5.0之前的系統(tǒng)中并不存在,所以為了兼顧之前的老系統(tǒng),我們不能使用android:attribute的寫法了而是應(yīng)該采用app:attribute.

使用Toolbar控件使用<android.support.v7.widget.Toolbar/>

3

使用"app:屬性名"兼顧低版本系統(tǒng)的條件:屬性是Android5.0系統(tǒng)之后新增的,之前版本沒(méi)有這個(gè)屬性便可以用"app:屬性名"兼顧低版本系統(tǒng)了

注意:在代碼中使用Toolbar和之前的button有不同之處,都先要找到控件 用findViewbyid Toolbar的不同之處在于還要調(diào)用setsupportActionBar()方法將Toolbar實(shí)例傳入,只有這樣我們就做到了及使用了Toolbar又讓它的外觀和功能都和ActionBar一致了.

setsupportActionBar(toolbar)的作用:將Toolbar的外觀和功能與ActionBar一致.

Toolbar的常用功能

修改標(biāo)題欄上顯示的文字內(nèi)容:在AndroidManifest.xml文件中通過(guò)android:label屬性指定

在Toolbar上設(shè)置action按鈕:首先提前準(zhǔn)備好要放的圖片.新建一個(gè)menu的文件夾,然后再這個(gè)menu文件夾中新建Menu resource file創(chuàng)建一個(gè)toolbar.xml通過(guò)item標(biāo)簽來(lái)指定各個(gè)選項(xiàng)的圖標(biāo),名稱,和showAsAction屬性.

注意:Toolbar上的按鈕只會(huì)顯示圖標(biāo),菜單中的action按鈕只會(huì)顯示文字

4
5

運(yùn)用之前學(xué)的知識(shí)創(chuàng)建一個(gè)菜單便可以了.

滑動(dòng)菜單

滑動(dòng)菜單就是將一些菜單項(xiàng)隱藏起來(lái),而不是放置在主屏幕上,然后可以通過(guò)滑動(dòng)的方式將菜單顯示出來(lái).

谷歌提供了一個(gè)DrawerLayout控件,借助于這個(gè)控件,實(shí)現(xiàn)滑動(dòng)菜單簡(jiǎn)單又方便.

DrawerLayout用法

它是一個(gè)布局,在這個(gè)布局中允許放入兩個(gè)直接子控件,第一個(gè)子控件是屏幕中顯示的內(nèi)容,第二個(gè)子控件是滑動(dòng)菜單中顯示的內(nèi)容.(準(zhǔn)確把握直接的含義,我們之前在學(xué)習(xí)scrollview時(shí),scrollview也是允許一個(gè)直接子控件)

注意:DrawerLayout中第二個(gè)直接子控件中的layyout_gravity這個(gè)屬性是必須要指定的,因?yàn)槲覀円嬖VDrawerLayout滑動(dòng)菜單是在屏幕左邊還是右邊,指定left表示滑動(dòng)菜單在左邊,指定right表示滑動(dòng)菜單在右邊.

android:layout_gravity="start"指定為start表示會(huì)根據(jù)系統(tǒng)語(yǔ)言進(jìn)行判斷,如果系統(tǒng)語(yǔ)言是從左往右的,比如英語(yǔ),漢語(yǔ),滑動(dòng)菜單便在左邊,如果系統(tǒng)語(yǔ)言是從右往左的,比如阿拉伯語(yǔ),滑動(dòng)菜單就在右邊.

提示用戶滑動(dòng)菜單的功能

Material Design建議的做法是在Toolbar的最左邊加入一個(gè)導(dǎo)航按鈕,點(diǎn)擊了導(dǎo)航按鈕也會(huì)將滑動(dòng)菜單的內(nèi)容顯示出來(lái).這便相當(dāng)于給用于提供了兩種打開滑動(dòng)菜單的方式.

在代碼中實(shí)現(xiàn)的過(guò)程為:

1.調(diào)用findviewbyid()方法獲取DrawerLayout的實(shí)例

2.調(diào)用getSupportActionBar()方法得到了ActionBar的實(shí)例,雖然這個(gè)ActionBar的具體實(shí)現(xiàn)是由Toolbar來(lái)實(shí)現(xiàn)的

3.調(diào)用ActionBar的setDisplayHomeAsUpEnabled()方法讓導(dǎo)航按鈕顯示出來(lái)

4.調(diào)用setHomeAsUpIndicator()方法來(lái)設(shè)置一個(gè)導(dǎo)航按鈕圖標(biāo)

5.接下來(lái)在onOptionsItemSelected()方法中對(duì)HomeAsUp按鈕的點(diǎn)擊事件進(jìn)行處理,HomeAsUp按鈕的id永遠(yuǎn)都是android.R.id.home

6.然后調(diào)用DrawerLayout的openDrawer()方法將滑動(dòng)菜單顯示出來(lái)(注意:openDrawer()方法要求傳入一個(gè)Gravity參數(shù),該參數(shù)要和XML中定義的行為一致,所以應(yīng)該傳入GravityCompat.START-------表示告訴DrawerLayout滑動(dòng)菜單在屏幕左邊還是右邊,這里表示是根據(jù)系統(tǒng)語(yǔ)言進(jìn)行判斷)

6

NavigationView

在滑動(dòng)菜單項(xiàng)中定制任意的布局,從而優(yōu)化滑動(dòng)菜單界面---------NavigationView是Design Support庫(kù)中提供的一個(gè)控件,它不僅嚴(yán)格按照Material Design的要求進(jìn)行設(shè)計(jì),而且還將滑動(dòng)菜單頁(yè)面的實(shí)現(xiàn)變得非常簡(jiǎn)單.

NavigationView的用法

1.首先將這個(gè)庫(kù)引入build.gradle文件的閉包,在dependencies閉包中添加如下內(nèi)容:

compile'com.android.support:design:26.1.0'(因?yàn)镹avigationView是Design Support庫(kù)中提供的一個(gè)控件)

implementation'de.hdodenhof:circleimageview:2.2.0'

其中第一行是Design Support庫(kù),第二行是一個(gè)開源項(xiàng)目CircleImageView------可以輕松用來(lái)實(shí)現(xiàn)圖片圓形化的功能.項(xiàng)目地址是:https://github.com/hdodenhof/CircleImageView? (在開始使用NavigationView之前我們要準(zhǔn)備好兩個(gè)東西:menu和headerLayout,其中menu是用來(lái)在NavigationView中顯示具體的菜單項(xiàng)的,headerLayout是用來(lái)在NavigationView中顯示頭部布局的)

2.先準(zhǔn)備menu

7

3.準(zhǔn)備headerLayout,這是一個(gè)可以隨意定制的布局

8

4.menu和headerLayout準(zhǔn)備好了之后,才可完成NavigationView的定義.打開DrawerLayout的布局文件

9

5.處理菜單項(xiàng)的點(diǎn)擊事件,修改代碼為

獲取到了NavigationView的實(shí)例

調(diào)用它的setCheckedItem()方法將菜單項(xiàng)中的其中一個(gè)菜單項(xiàng)設(shè)置為默認(rèn)選中(方法中需要傳入一個(gè)菜單項(xiàng)的id)

調(diào)用setNavigationItemSelectedListener()方法設(shè)置一個(gè)菜單項(xiàng)選中事件的監(jiān)聽器,當(dāng)用戶點(diǎn)擊了任意菜單項(xiàng)時(shí),就會(huì)回調(diào)到onNavigationItemSelected()方法中,我們可以在這個(gè)方法中填寫相應(yīng)的邏輯,我在這里調(diào)用了DrawerLayout的closeDrawers()方法將滑動(dòng)菜單關(guān)閉.

懸浮按鈕和可交互提示

懸浮按鈕不屬于主界面平面的一部分,而是位于另一個(gè)維度的,所以會(huì)給人一種懸浮的感覺(jué)

FloatingActionButton

FloatingActionButton是Design Support庫(kù)中提供的一個(gè)控件,這個(gè)控件可以幫助我們比較輕松地實(shí)現(xiàn)懸浮按鈕的效果.懸浮按鈕默認(rèn)使用colorAccent來(lái)作為按鈕的顏色,可以通過(guò)給按鈕指定一個(gè)圖標(biāo)來(lái)表明這個(gè)按鈕的作用是什么.

FloatingActionButton的用法

首先如果build/gradle中閉包中沒(méi)有引入相應(yīng)的庫(kù)的話要提前引入相應(yīng)的庫(kù)? compile'com.android.support:design:26.1.0'

提前為懸浮按鈕準(zhǔn)備好圖片,然后在布局文件中引入懸浮按鈕標(biāo)簽<android.support.design.widget.FloatingActionButton>.

android:layout_gravity="bottom|end"屬性指定將這個(gè)控件放置到屏幕的右下方:其中end的工作原理和之前的start是一樣的,即如果系統(tǒng)語(yǔ)言是從左往右的,那么end就表示在右邊,反之在左邊.

android:src="@drawable/ic_done"通過(guò)src屬性給FolatingActionButton設(shè)置了一個(gè)圖標(biāo)

10

FloatingActionButton處理點(diǎn)擊事件:和普通的Button設(shè)置點(diǎn)擊事件沒(méi)有什么區(qū)別都是先聲明控件找到控件然后調(diào)用setOnClickListener()方法,在方法內(nèi)寫具體的邏輯.

Snackbar

更為先進(jìn)的提示工具,是由Design Support庫(kù)提供的(如果想要使用的話需要提前在閉包中引入相應(yīng)的庫(kù),如果閉包中沒(méi)有引入這個(gè)庫(kù)的話).

Snackbar和Toast的區(qū)別

Toast的作用是告訴用戶現(xiàn)在發(fā)生了什么事情,但同時(shí)用戶只能被動(dòng)接收這個(gè)事情.因?yàn)闆](méi)有什么辦法讓用戶進(jìn)行選擇.

Snackbar允許在提示當(dāng)中加入一個(gè)可交互按鈕,當(dāng)用戶點(diǎn)擊按鈕的時(shí)候可以執(zhí)行一些額外的邏輯操作.(比如誤刪數(shù)據(jù)的提示)

Snackbar的用法

和Toast基本類似,只不過(guò)可以額外增加一個(gè)按鈕的點(diǎn)擊事件

11

CoordinatorLayout

加強(qiáng)版的FrameLayout,這個(gè)布局也是由Design Support庫(kù)提供的,可以監(jiān)聽其所有的子控件的各種事件,然后自動(dòng)幫我們做出最為合理的響應(yīng).比如彈出的Snackbar提示將懸浮按鈕遮擋住了,而如果我們能讓CoordinatorLayout監(jiān)聽到Snackbar的彈出事件,那么它會(huì)自動(dòng)將內(nèi)部的FloatingActionButton向上偏移,從而確保不會(huì)被Snackbar遮擋到.

12
13

卡片式布局

CardView

CardView是用于實(shí)現(xiàn)卡片式布局效果的重要控件,由appcompat-v7庫(kù)提供,CardView實(shí)際上也是一個(gè)FrameLayout,只是額外提供了圓角和陰影的效果,看上去有立體的感覺(jué).

用CardView之前需要引入相應(yīng)的庫(kù)compile'com.android.support:cardview-v7:26.1.0'(因?yàn)镃ardView由appcompat-v7庫(kù)提供)

常用屬性:app:cardCornerRadius="4dp" 指定卡片圓角的弧度,數(shù)值越大弧度越大

app:elevation屬性指定卡片的高度,高度值越大,投影范圍越大

具體例子結(jié)合RecycleView和CardView設(shè)計(jì)了一個(gè)水果的卡片式布局,代碼都是之前的東西就不寫了...

Glide在內(nèi)部做了很多的非常復(fù)雜的邏輯操作,包括圖片的壓縮,我們只需要安心按照Glide的用法去加載圖片即可,完全不用擔(dān)心內(nèi)存溢出的問(wèn)題.

AppBarLayout

14

由Design Support庫(kù)提供的AppBarLayout,它是一個(gè)垂直方向的LinearLayout,在內(nèi)部做了很多滾動(dòng)事件的封裝,并應(yīng)用了一些Material Design的設(shè)計(jì)理念.

主要作用:解決內(nèi)容覆蓋Toolbar的問(wèn)題(比如圖片覆蓋住了Toolbar)

主要步驟分為:1.將被覆蓋的Toolbar嵌入到AppBarLayout中

2.給RecyclerView指定一個(gè)布局行為(因?yàn)槭荝ecyclerView覆蓋住了Toolbar嘛)

15

在RecylcerView中使用app:layout_behavior="@string/appbar_scrolling_view_behavior"屬性指定了一個(gè)布局行為(本例中是RecyclerView的滾動(dòng)行為),當(dāng)RecyclerView滾動(dòng)的時(shí)候會(huì)將滾動(dòng)事件通知給AppBarLayout.

16

當(dāng)AppBarLayout接收到滾動(dòng)事件的時(shí)候,它內(nèi)部的子控件其實(shí)是可以指定如何去影響這些事件的,通過(guò)app:layout_behavior屬性就能實(shí)現(xiàn).然后在Toolbar中設(shè)置app:layout_scrollFlags="scroll|enterAlways|snap"其中scroll表示當(dāng)RecyclerView向上滾動(dòng)的時(shí)候,Toolbar會(huì)跟著一起向上滾動(dòng)并實(shí)現(xiàn)隱藏;enterAlways表示當(dāng)RecyclerView向下滾動(dòng)的時(shí)候,Toolbar會(huì)跟著一起向下滾動(dòng)并重新顯示.snap表示當(dāng)Toolbar還沒(méi)有完全隱藏顯示的時(shí)候,會(huì)根據(jù)當(dāng)前滾動(dòng)的距離,自動(dòng)選擇隱藏還是顯示

下拉刷新

SwipeRefreshLayout是實(shí)現(xiàn)下拉刷新功能的核心類。它是由support-v4庫(kù)提供的。我們把想要實(shí)現(xiàn)下拉刷新功能的控件放置到SwipeRefreshLayout中,就可以迅速讓這個(gè)控件支持下拉刷新。

另外需要注意的是:由于RecyclerView現(xiàn)在變成了SwipeRefreshLayout的子控件,因此之前使用app:layout-behavior聲明的布局行為現(xiàn)在也要移動(dòng)到SwipeRefreshLayout中才行。

雖然RecyclerView已經(jīng)支持下拉刷新功能,但是還是要在代碼中處理具體邏輯才行。

1.聲明控件 然后findViewbyId()找到控件,然后調(diào)用setColorSchemeResource()方法來(lái)設(shè)置下拉刷新進(jìn)度條的顏色

2.調(diào)用setOnRefreshFruits()方法來(lái)設(shè)置一個(gè)下拉刷新的監(jiān)聽器,當(dāng)觸發(fā)了下拉刷新操作的時(shí)候就會(huì)回調(diào)這個(gè)監(jiān)聽器的onRefresh()方法,然后我們?cè)谶@里處理具體的邏輯就可以了

通常情況下,onfresh()方法應(yīng)該去網(wǎng)上請(qǐng)求最新的數(shù)據(jù),然后再將這些數(shù)據(jù)展示出來(lái)。

可折疊式標(biāo)題欄

CollapsingToolbarLayout(實(shí)現(xiàn)可折疊式標(biāo)題欄的效果)

CollapsingToolbarLayout是一個(gè)作用于Toolbar基礎(chǔ)上的布局,它也是由Design Support庫(kù)提供的,CollapsingToolbarLayout可以讓Toolbar的效果變得更加豐富,不僅僅展示一個(gè)標(biāo)題欄,而是能夠?qū)崿F(xiàn)非常華麗的效果。

CollapsingToolbarLayout是不能獨(dú)立存在的,它在設(shè)計(jì)的時(shí)候被限定只能作為AppBarLayout的直接子布局來(lái)使用。而AppBarLayout又必須是CoordinatorLayout的子布局。

CollapsingToolbarLayout屬性:app:contentScrim用于指定CollapsingToolbarLayout在趨于折疊狀態(tài)以及折疊之后的背景色

我們準(zhǔn)備編的布局主要分為兩個(gè)部分:一個(gè)是水果標(biāo)題欄,一個(gè)是水果內(nèi)容詳情

標(biāo)題欄部分:最外層布局我們?cè)O(shè)置為CoordinatorLayout,注意始終記得要定義一個(gè)xmln:app的命名空間,在Material Design的開發(fā)中會(huì)經(jīng)常用到它.

然后在CoordinatorLayout內(nèi)嵌套一個(gè)AppBarLayout,其中AppBarLayout布局很簡(jiǎn)單我們不做過(guò)多的解釋;接下來(lái)再在AppBarLayout中嵌套一個(gè)CollapsingToolbarLayout.

17

接下來(lái)我們開始定義標(biāo)題欄的具體內(nèi)容,我們?cè)贑ollapsingToolbarLayout中定義了一個(gè)ImageView和一個(gè)Toolbar,意味著我們的這個(gè)高級(jí)版的標(biāo)題欄將是由普通的標(biāo)題欄加上圖片組合而成的.

18

我們比較陌生的屬性app:layout_collapseMode:它用于指定當(dāng)前控件在CollapsingToolbarLayout折疊過(guò)程中的折疊模式,其中Toolbar中指定為pin表示在折疊過(guò)程中位置始終不變,ImageView指定成parallax,表示會(huì)在折疊過(guò)程中產(chǎn)生一定的錯(cuò)位偏移,這種模式的視覺(jué)效果比較好.

水果內(nèi)容詳情部分:

水果內(nèi)容詳情的最外層部分我們使用了一個(gè)NestedScrollView.我們之前學(xué)過(guò)ScrollView(它允許使用滾動(dòng)的方式來(lái)查看屏幕以外的數(shù)據(jù)),而NestedScrollView不僅允許使用滾動(dòng)的方式來(lái)查看屏幕以外的數(shù)據(jù)還增加了嵌套響應(yīng)滾動(dòng)事件的功能.由于CoordinatorLayout本身就已經(jīng)可以響應(yīng)滾動(dòng)事件了,因此我們?cè)谒膬?nèi)部就需要使用NestedScrollView或RecyclerView這樣的布局.

不管是ScrollView還是NestedScrollView在他們內(nèi)部只能有一個(gè)直接子布局,如果我們想在里面放入更多的東西的話我們通常先嵌套一個(gè)LinearLayout,然后再LinearLayout中再放入具體的內(nèi)容即可.

19

使用一個(gè)TextView來(lái)顯示水果內(nèi)容詳情,并將TextView放在一個(gè)卡片式布局里面.我們還可以在界面上加一個(gè)懸浮按鈕當(dāng)然這個(gè)不是必需的.根據(jù)具體需求再添加即可.

20

FloatingActionButton中使用app:layout_anchor屬性指定了一個(gè)錨點(diǎn),我們將錨點(diǎn)設(shè)置為AppBarLayout,這樣懸浮按鈕就會(huì)出現(xiàn)在水果標(biāo)題欄的區(qū)域內(nèi).接著又使用app:layout_anchorGravity屬性將懸浮按鈕定位在標(biāo)題欄區(qū)域的右下角.

界面完成之后我們編寫功能邏輯,

public class FruitActivity extends AppCompatActivity {

public static final String FRUIT_NAME="fruit_name";

public static final String FRUIT_IMAGE_ID="fruit_image_id";

@Override protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_fruit);

//通過(guò)Intent獲取到傳入的水果名和水果圖片的ID Intent intent=getIntent();

//通過(guò)Intent獲取到傳入的水果名 String fruitName=intent.getStringExtra(FRUIT_NAME);

//通過(guò)Intent獲取到傳入水果圖片的ID int fruitImageId=intent.getIntExtra(FRUIT_IMAGE_ID,0);

//這里的toolbar必須是V7包下的 Toolbar toolbar=findViewById(R.id.toolbar);

CollapsingToolbarLayout collapsingToolbarLayout=findViewById(R.id.collapsing_toolbar);

ImageView fruitImageView=findViewById(R.id.fruit_image_view);

TextView fruitContentText=findViewById(R.id.fruit_content_text);

//不然這里會(huì)報(bào)錯(cuò) setSupportActionBar(toolbar); ActionBar actionBar=getSupportActionBar();

if (actionBar!=null){ actionBar.setDisplayHomeAsUpEnabled(true); }

collapsingToolbarLayout.setTitle(fruitName);

Glide.with(FruitActivity.this).load(fruitImageId).into(fruitImageView);

String fruitContent=generateFruitContent(fruitName);

fruitContentText.setText(fruitContent); }

private String generateFruitContent(String fruitName) {

StringBuilder fruitContent=new StringBuilder();

for (int i=0;i<500;i++){ fruitContent.append(fruitName); }

return fruitContent.toString(); }

@Override public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()){

case android.R.id.home:

finish();

return true; }

return super.onOptionsItemSelected(item); }}

然后記得處理RecyclerView的點(diǎn)擊事件:

final ViewHolder holder=new ViewHolder(view);

holder.cardView.setOnClickListener(new View.OnClickListener() {

@Override

? ? public void onClick(View v) {

int position=holder.getAdapterPosition();

? ? ? ? Fruit fruit=mFruitList.get(position);

? ? ? ? Intent intent=new Intent(mContext,FruitActivity.class);

? ? ? ? intent.putExtra(FruitActivity.FRUIT_NAME,fruit.getName());

? ? ? ? intent.putExtra(FruitActivity.FRUIT_IMAGE_ID,fruit.getImageId());

? ? ? ? mContext.startActivity(intent);}});

return holder;

給CardView注冊(cè)一個(gè)點(diǎn)擊事件監(jiān)聽器,然后再點(diǎn)擊事件中獲取當(dāng)前點(diǎn)擊項(xiàng)的水果名和水果資源ID,把他們傳入到Intent中,最后調(diào)用startActivity()方法啟動(dòng)FruitActivity.

充分利用系統(tǒng)狀態(tài)空間

Android5.0系統(tǒng)之前我們無(wú)法對(duì)狀態(tài)欄的背景或顏色進(jìn)行操作的,Android5.0之后才有了Material Design的概念,所以我們實(shí)現(xiàn)一個(gè)系統(tǒng)差異型的效果,在Android5.0之后的系統(tǒng),使用背景圖和狀態(tài)欄融合的模式,在之前的系統(tǒng)中使用普通模式.

想要背景圖和系統(tǒng)狀態(tài)欄融合,需要借助android:fitsSystemWindows這個(gè)屬性:

21

然后還要將程序的主題中將狀態(tài)欄顏色指定為透明色才行,在主題中將android:statusBarColor這個(gè)屬性指定為@android:color/transparent即可,問(wèn)題在于android:statusBarColor這個(gè)屬性是從API21,也就是Android5.0系統(tǒng)開始才有的,之前的系統(tǒng)無(wú)法指定這個(gè)屬性.系統(tǒng)差異型的功能實(shí)現(xiàn)就要從這里開始了.

22
23

本章中用到的庫(kù)總結(jié):

24

知識(shí)體系總結(jié):


25
26
27
28
29
30
31
最后編輯于
?著作權(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)容