最近在用toolbar心剥,然后在使用searchview搜索的時(shí)候膳灶,遇到一個(gè)問(wèn)題涝开,無(wú)論如何影斑,那個(gè)toolbar中通過(guò)menu還是不能修改searchview的圖標(biāo)和其他一些顏色屬性的。
如圖:
解決方法:
//通過(guò)找到search view里面的一個(gè)叫做appcompatImageViewbutton來(lái)修改圖標(biāo)和顏色
AppCompatImageViewbutton=(AppCompatImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_button);
button.setImageResource(R.mipmap.ic_search);
//搜索的那個(gè)X的刪除圖標(biāo)也是可以通過(guò)這種方式來(lái)修改的
//下面是在搜索欄的字體蓬坡,設(shè)置為白色,默認(rèn)也是黑色
TextViewtextView=(TextView)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
textView.setTextColor(Color.WHITE);
解決思路:
如果你看到上面的解決方法已經(jīng)解決了問(wèn)題磅叛,那就祝賀你屑咳。如果有興趣的話可以看看這里的解決思路,它可以幫助你在以后遇到其他問(wèn)題的時(shí)候弊琴,根據(jù)相同的思路來(lái)思考解決問(wèn)題
這個(gè)問(wèn)題肯定大家也會(huì)遇到兆龙,因?yàn)槲以诰W(wǎng)上搜解決方法的時(shí)候也看到了許多的問(wèn)題貼,甚至是stackoverflow上面也搜過(guò)敲董,也有一些解決方案紫皇。
最多的三種:
第一種
int search_mag_icon_id = mSearchView.getContext().getResources().getIdentifier("android:id/search_mag_icon", null, null);
ImageView mSearchViewIcon = (ImageView) mSearchView.findViewById(search_mag_icon_id);// 獲取搜索圖標(biāo)
mSearchViewIcon.setImageResource(R.drawable.ic_menu_search_holo_dark);
mSearchView.setIconifiedByDefault(false);(設(shè)置搜索圖標(biāo)在編輯框外慰安,ture時(shí)在框內(nèi))。
用此方法修改時(shí)成功了聪铺,但是只要一設(shè)置mSearchView.setIconifiedByDefault(true)化焕,搜索圖標(biāo)就右成了系統(tǒng)的圖標(biāo)。
第二種
第三種
第一種方法我試過(guò)铃剔,不行撒桨,會(huì)報(bào)空指針,因?yàn)橥ㄟ^(guò)identifier("")來(lái)找到對(duì)應(yīng)的id键兜,我調(diào)試過(guò)凤类,id能夠找到,但是不確定是不是對(duì)的蝶押,不過(guò)你還是不能通過(guò)searchview.findviewbyid 來(lái)找到所謂的imageview textview什么的踱蠢,空指針。
當(dāng)時(shí)我就照著這種思路棋电,然后在調(diào)試的時(shí)候去看了searchview的mChildern茎截、mChildren的mChildren,子孫都去找了,然后看了一下他們的id好像已經(jīng)不是所謂的android:id/search_mag_icon 了赶盔,而是app:id/search_mag_icon, 不信你可以看看
但是企锌,即便是改成后面那個(gè)也不行,還是找不到于未,依舊空指針撕攒,我也不知道怎么回事了。
第二種我也試過(guò)烘浦,對(duì)于我而言不行抖坪。大家都知道現(xiàn)在基本很多都是用appcompatActivity了,所以現(xiàn)在所用的主題一般也都是appcompat相關(guān)的主題了闷叉。沒有誰(shuí)還在用老主題的擦俐。
即便你還在用老主題,但是握侧,它也只是根據(jù)老主題的兩種 holo.light 蚯瞧、dark來(lái)改變searchview 那個(gè)搜索圖標(biāo)的顏色,白色品擎、黑色埋合,但是根本滿足不了我們的要求。
還有萄传,如果要用這種修改主題的方式的話甚颂,就必須使用actionbar,但是你知道現(xiàn)在我們都是用toolbar來(lái)替換actionbar,這個(gè)沒話說(shuō),如果在activity中直接使用setActionbar就可以了振诬。
但是瓣铣,我們?cè)趂ragment里面使用toolbar呢?那就不行了贷揽,因?yàn)槎鄶?shù)情況下,我們的主題都是 noActionbar的梦碗,因?yàn)槲覀円远xtoolbar呀禽绪。而且對(duì)于現(xiàn)在這種 一個(gè)activity下面裝多個(gè)fragment來(lái)實(shí)現(xiàn)那種底部導(dǎo)航的潮流結(jié)構(gòu)中,一般我們的每個(gè)fragment的toolbar都是不一樣的洪规,所以不可能用一個(gè)activity的toolbar來(lái)動(dòng)態(tài)切換或者改變印屁,那樣太復(fù)雜了。
第三種斩例,親測(cè)過(guò)雄人,也是沒有什么用,因?yàn)槠鋵?shí)他修改的是toolbar的字體顏色念赶,還有一些默認(rèn)圖標(biāo)的顏色础钠,但是它不可以修改,searchview展開之后的搜索的框中的字體顏色
所以的所以叉谜,總而又言之就是旗吁,上述三種親測(cè),不適用停局。
解決核心思路:
重點(diǎn)來(lái)了很钓,既然主題什么的不行,那我們可以依照第一種方法的思路來(lái)?yè)Q個(gè)角度試試董栽。
很多時(shí)候你會(huì)發(fā)現(xiàn)码倦,官方的一些組件,里面有很多成員變量或者里面有很多子view锭碳,但是只暴露出很少的方法去讓你修改一些屬性袁稽。很多是private的方法,這時(shí)候你會(huì)想如果是public該多好啊工禾。
所以运提,你就會(huì)想要去繼承重寫什么的,但是那樣我覺得有點(diǎn)麻煩闻葵。
于是民泵,我就想,你看槽畔,如果找到里面的子view,那不就可以通過(guò)子view來(lái)修改里面的內(nèi)容了啊栈妆。比如,searchview里面的那個(gè)放大鏡的那個(gè)圖標(biāo),肯定應(yīng)該是一個(gè)imageview吧鳞尔,如果我們能通過(guò)什么方式找出來(lái)嬉橙,那么就可以修改了嘛。
很常見的就是通過(guò)findviewbyId寥假,所以就去找ID吧市框。
那么現(xiàn)在就要去看看源碼了,看了searchview的源碼糕韧。
id的名字你也看見了萤彩,不過(guò)它們沒有在自己的工程里粪滤,它是在support.v7里面的。
于是去里面找雀扶,找android.support.v7.appcompat.R.id.search_button就能找到了杖小,
基本就大功告成了,然后你就通過(guò)search findviewbyid 找出來(lái)愚墓,然后就可以隨意設(shè)置了予权,真爽!浪册!
其他的一些子view也是一樣伟件,都可以找出來(lái)然后自己隨意改!
好爽议经!總結(jié)一下:
如果一個(gè)組件是很多子view混合構(gòu)成的斧账,你就可以通過(guò)找到子view,然后去修改子view,就能達(dá)到修改組件的效果了煞肾。
希望對(duì)大家有用咧织,謝謝