有一段時(shí)間沒(méi)有總結(jié)記錄了,前段時(shí)間辭掉了我的第一份正式的工作,搞清楚了公司的大致流程以及我在工作崗位上主要的職責(zé)之后,發(fā)現(xiàn)不是我想要從事的,所以就辭掉了,任性了,好在第二次入職一家做智能硬件的公司,總算與我想要從事的工作挨點(diǎn)邊了,大家一起努力加油。進(jìn)入正題,在Android5.0以前標(biāo)題欄被ActionBar一家獨(dú)大,剛開(kāi)始接觸ActionBar時(shí),就會(huì)有這樣的疑問(wèn),這哥們貌似和ViewGroup沒(méi)有關(guān)系,從類的繼承結(jié)構(gòu)來(lái)看的確如此,好在從Android5.0開(kāi)始,推薦我們使用Toolbar來(lái)替代傳統(tǒng)的ActionBar,Toolbar更加的靈活可變,優(yōu)點(diǎn)多多,為了兼容5.0以前的版本,Toolbar放在support庫(kù)下。不知道大家發(fā)現(xiàn)沒(méi)有,隨著系統(tǒng)版本的更新,ActionBar也被更新了,因此我們可能使用的是android.support.v7.app包下的ActionBar,如果此時(shí)再采用傳統(tǒng)的getActionBar()方法來(lái)獲取ActionBar對(duì)象時(shí),獲取不到。
Toolbar繼承于ViewGrop,因此Toolbar下可以直接放置子布局,這常用于自定義標(biāo)題欄布局,比使用ActionMenuView更加的方便靈活。我們接下來(lái)不會(huì)介紹Toolbar和選項(xiàng)菜單 的基本使用,主要是一些細(xì)節(jié)上的問(wèn)題,比如選項(xiàng)菜單的那三個(gè)點(diǎn)怎么改變顏色,怎么顯示菜單項(xiàng)圖標(biāo)等問(wèn)題。
1. Fragment也想創(chuàng)建選項(xiàng)菜單
????????????在Android3.0以前是出現(xiàn)與活動(dòng)的底部,而在Android3.0以后,出現(xiàn)于標(biāo)題欄的右上角,就是那三個(gè)小點(diǎn),選項(xiàng)菜單的幾個(gè)相關(guān)的方法,有Activity的onCreateOptionsMenu、onOptionsItemSelected、onPrepareOptionsMenu等,至于Fragment也有類似的方法,onCreateOptionsMenu、onOptionsItemSelectd、setHasOptionsMenu等。當(dāng)Fragment想要為它所在的活動(dòng)提供選項(xiàng)菜單時(shí),就會(huì)調(diào)用Fragment的onCreateOptionsMenu方法,那么什么時(shí)候Fragment才會(huì)想要為Activity提供菜單項(xiàng)呢?很簡(jiǎn)單,F(xiàn)ragment必須在onCreate方法中通過(guò)setHasOptionsMenu方法來(lái)“告知”Activity說(shuō)我也想要提供菜單項(xiàng),這樣Activity在創(chuàng)建選項(xiàng)菜單時(shí),才會(huì)調(diào)用片段的onCreateOptionsMenu方法。
2. 如何響應(yīng)選項(xiàng)菜單事件
? ? ? ? ? ? 當(dāng)用戶點(diǎn)擊菜單項(xiàng)時(shí),首先會(huì)回調(diào)Activity的onOptionsItemSelected方法,因此我們可以在這個(gè)方法里面通過(guò)菜單項(xiàng)的id來(lái)區(qū)分點(diǎn)擊了哪一個(gè)菜單項(xiàng),如果此時(shí)Activity有Fragment,而且Fragment也提供了菜單項(xiàng),這里你可能會(huì)想不是一樣的道理嗎,直接在Fragment的onOptionsItemSelected方法處理就好了,沒(méi)錯(cuò),不過(guò)需要注意的是,如果此時(shí)Activity的onOptionsItemSelected方法返回了true,那么Fragment的菜單點(diǎn)擊響應(yīng)方法是不會(huì)調(diào)用了,這里就好比View的事件分發(fā)機(jī)制一樣,表示“消耗”了該事件。除了此種響應(yīng)菜單項(xiàng)點(diǎn)擊的方法之外,我們還可以在定義菜單資源時(shí),給菜單項(xiàng)添加android:onClick屬性,就像Button處理點(diǎn)擊事件方式一樣。


3.onCreateOptionsMenu方法的一點(diǎn)小細(xì)節(jié)
? ? ? ? ? ? 當(dāng)選項(xiàng)菜單被創(chuàng)建時(shí),會(huì)調(diào)用該方法,在Android3.0以前,通過(guò)物理按鍵呼出選項(xiàng)菜單,在活動(dòng)的底部彈出,每一次呼出都相當(dāng)于重新創(chuàng)建,也就說(shuō)每一次都會(huì)調(diào)用onCreateOptionsMenu方法來(lái)創(chuàng)建選項(xiàng)菜單;而在Android3.0以后,選項(xiàng)菜單不在通過(guò)物理按鍵呼出時(shí)呢,選項(xiàng)菜單會(huì)在活動(dòng)處于運(yùn)行狀態(tài)之后調(diào)用onCreateOptionsMenu進(jìn)行創(chuàng)建,不再像以前一樣每一次都重新調(diào)用onCreateOptionsMenu進(jìn)行創(chuàng)建,換句話說(shuō)onCreateOptionsMenu方法只會(huì)調(diào)用一次。而且onCreateOptionsMenu方法的返回值表示是否創(chuàng)建選項(xiàng)菜單,如果返回值為true,則表示創(chuàng)建選項(xiàng)菜單,反之不創(chuàng)建,最好根據(jù)super.onCreateOptionsMenu方法作為返回值,可以看它源碼。


4. 如何在活動(dòng)運(yùn)行狀態(tài)下更新選項(xiàng)菜單
? ? ? ? ? ? ? ? 前面我們已經(jīng)知道,在Android3.0以后我們想要根據(jù)onCreateOptionsMenu方法來(lái)實(shí)現(xiàn)在活動(dòng)處于運(yùn)行狀態(tài)下更新選項(xiàng)菜單變得不太可能,那么有什么辦法呢?還記得我們前提提到過(guò)的與選項(xiàng)菜單相關(guān)的方法嗎?其中有一個(gè)方法onPrepareOptionsMenu方法,對(duì)沒(méi)錯(cuò),我們就要利用該方法來(lái)動(dòng)態(tài)的更新選項(xiàng)菜單,如何來(lái)做呢?我們先來(lái)重寫(xiě)一下活動(dòng)的次方法,很簡(jiǎn)單就打印輸出一下,


可以看到調(diào)用onCreateOptionsMenu方法之后會(huì)調(diào)用onPrepareOptionsMenu方法,當(dāng)然這僅是打印輸出一下,證據(jù)可能不足,但是事實(shí)上的確如此,看看源碼,這里就不研究源碼,靠小伙伴自己下去研究了哦。因此只要調(diào)用了onCreateOptionsMenu方法就會(huì)調(diào)用onPrepareOptionsMenu方法,實(shí)參指的就是選項(xiàng)菜單,而且選項(xiàng)菜單的顯示是在onPrepareOptionsMenu方法之后,但是僅知道這一點(diǎn)還不夠,因?yàn)閛nPrepareOptionsMenu方法在onCreateOptionsMenu方法調(diào)用了之后才會(huì)調(diào)用,并不是我們主動(dòng)調(diào)用的而是被動(dòng)調(diào)用的,而且通過(guò)前面的分析我們知道Android3.0以上只會(huì)調(diào)用一次,但是Android就是提供onPrepareOptionsMenu方法讓我們能夠動(dòng)態(tài)的更新選項(xiàng)菜單,如何來(lái)做到呢?invalidateOptionsMenu()方法,該方法會(huì)請(qǐng)求調(diào)用onPrepareOptionsMenu方法,因此我們就可以在onPrepareOptionsMenu方法當(dāng)中來(lái)更新我們的選項(xiàng)菜單;Fragment中也有相應(yīng)的方法哦。
5.改變選項(xiàng)菜單“三個(gè)點(diǎn)”的顏色
? ? ? ? ? ? 經(jīng)常使用選項(xiàng)菜單的小伙伴都知道選項(xiàng)菜單那“三個(gè)點(diǎn)”默認(rèn)是黑色的,我們?nèi)绾蝸?lái)改變的它的顏色呢,很簡(jiǎn)單我們只需要在當(dāng)前活動(dòng)使用的主題當(dāng)中覆蓋掉父類中選項(xiàng)菜單顏色值即可,即重新添加“android:textColorSecondary”屬性值,如下:

6.如何顯示菜單項(xiàng)的圖標(biāo)
? ? ? ? ? ? 我們都知道選項(xiàng)菜單中的菜單項(xiàng)即使設(shè)置了圖標(biāo),它默認(rèn)是不顯示的,如下所示:

除非菜單項(xiàng)到了標(biāo)題欄當(dāng)中,那么有沒(méi)有方法讓選項(xiàng)菜單中的菜單項(xiàng)也能顯示圖標(biāo)呢?有的,之所以不顯示,是因?yàn)锳ndroid4.0修改了源碼,將設(shè)置圖標(biāo)顯示的方法進(jìn)行了隱藏,我們可以通過(guò)反射進(jìn)行調(diào)用修改,如下

結(jié)果如下:
