好記性不如爛筆頭。生活中多做筆記述雾,不僅可以方便自己,還可以方便他人兼丰。
背景
以往玻孟,絕大多數(shù)的,我們的ListPreference的summary和entries都是純文字的鳍征,這沒(méi)啥可說(shuō)的黍翎,簡(jiǎn)單方便嘛。突然有一天艳丛,產(chǎn)品經(jīng)理跟我說(shuō)匣掸,這個(gè)加上個(gè)圖片會(huì)更生動(dòng)好看一點(diǎn)。作為“”開(kāi)發(fā)汪”氮双,面對(duì)新的東西碰酝,內(nèi)心是“”雞凍”澎湃的,立馬拍拍胸口“包在我身上”戴差。
正文
看到這樣的樣式送爸,第一想法是重寫(xiě)view替換其中的布局,挺簡(jiǎn)單的嘛,不就是繪制一下文字跟圖片而已袭厂,位置隨便來(lái)墨吓,想怎么搞就怎么搞。于是我著手看源碼纹磺,尋找布局帖烘,找接口¢涎睿看到?setDialogLayoutResource?時(shí)心中暗想“這不是挺簡(jiǎn)單的嘛”秘症。然而問(wèn)題來(lái)了,我得替換整個(gè)布局讥珍,前提是不能修改整個(gè)彈框的風(fēng)格历极,因?yàn)檫@個(gè)ListPreference得跟其他的看起來(lái)一個(gè)風(fēng)格,如果把布局寫(xiě)得一模一樣也不是不行衷佃,但感覺(jué)有點(diǎn)小題大作了。
我的目標(biāo)很明確蹄葱,只是插入一個(gè)圖標(biāo)而已氏义,僅此而已啊图云!
前面的方法不實(shí)際惯悠,于是我繼續(xù)google,百度竣况。找著找著克婶,我突然想起,做到文字中插入圖片的還有一個(gè)辦法丹泉,那就是 SpannableString情萤。于是我趕緊看回ListPreference的源碼,重點(diǎn)來(lái)了摹恨。
ListPreference的setSummary方法:
ListPreference的setEntries方法:
從上面的兩個(gè)方法看筋岛,文字的傳入都是CharSequence類(lèi)型,再看看SpannableString晒哄,剛好是實(shí)現(xiàn)了CharSequence接口睁宰。
好了,思路有了寝凌,說(shuō)干就干柒傻。
代碼非常的簡(jiǎn)單,就那么幾句较木,上圖:
創(chuàng)建好SpannableString之后红符,我們就可以插入圖片了,位置可以隨便插。這里以插入中間為例违孝。上面的“image”就是我要替換為圖片的字符串刹前,我們要插入的是圖片,所以只能通過(guò)ImageSpan雌桑,注意setSpan的時(shí)候start和end的位置要算對(duì)喇喉。
細(xì)心的你會(huì)發(fā)現(xiàn),我上面用的TestListPreference校坑,并不是ListPreference拣技,為啥?因?yàn)槲抑貙?xiě)了ListPreference耍目,為啥要重寫(xiě)膏斤?因?yàn)槲野l(fā)現(xiàn),ListPreference的mSummary是String類(lèi)型邪驮,這樣的話莫辨,我們的的summary就無(wú)法插入圖片了,所以重寫(xiě)了setSummary方法和getSummary方法:
好了毅访,成功的在summary和entries中插入圖片沮榜,來(lái)看看成果:
然而,你會(huì)發(fā)現(xiàn)喻粹,圖片的位置水平方向沒(méi)有居中蟆融,偏下沉了,所以我們還要調(diào)整一下守呜。
繼承ImageSpan型酥,我們重新draw方法:
代碼比較簡(jiǎn)單,我就直接全部貼出來(lái)了查乒。
OK弥喉,我們?cè)賮?lái)看看效果:
好了,全部完成了侣颂。
結(jié)尾
東西比較簡(jiǎn)單档桃,內(nèi)容也不多,但還是寫(xiě)出來(lái)憔晒,喜歡就拿去唄藻肄,反正又不要錢(qián),而且我也是參考了網(wǎng)上很多的資料拒担。