最近在用toolbar,然后在使用searchview搜索的時候,遇到一個問題,無論如何,那個toolbar中通過menu還是不能修改searchview的圖標和其他一些顏色屬性的。
如圖:
解決方法:
//通過找到search view里面的一個叫做appcompatImageViewbutton來修改圖標和顏色
AppCompatImageViewbutton=(AppCompatImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_button);
button.setImageResource(R.mipmap.ic_search);
//搜索的那個X的刪除圖標也是可以通過這種方式來修改的
//下面是在搜索欄的字體,設置為白色,默認也是黑色
TextViewtextView=(TextView)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
textView.setTextColor(Color.WHITE);
解決思路:
如果你看到上面的解決方法已經解決了問題,那就祝賀你。如果有興趣的話可以看看這里的解決思路,它可以幫助你在以后遇到其他問題的時候,根據相同的思路來思考解決問題
這個問題肯定大家也會遇到,因為我在網上搜解決方法的時候也看到了許多的問題貼,甚至是stackoverflow上面也搜過,也有一些解決方案。
最多的三種:
第一種
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);// 獲取搜索圖標
mSearchViewIcon.setImageResource(R.drawable.ic_menu_search_holo_dark);
mSearchView.setIconifiedByDefault(false);(設置搜索圖標在編輯框外,ture時在框內)。
用此方法修改時成功了,但是只要一設置mSearchView.setIconifiedByDefault(true),搜索圖標就右成了系統的圖標。
第二種
第三種
第一種方法我試過,不行,會報空指針,因為通過identifier("")來找到對應的id,我調試過,id能夠找到,但是不確定是不是對的,不過你還是不能通過searchview.findviewbyid 來找到所謂的imageview textview什么的,空指針。
當時我就照著這種思路,然后在調試的時候去看了searchview的mChildern、mChildren的mChildren,子孫都去找了,然后看了一下他們的id好像已經不是所謂的android:id/search_mag_icon 了,而是app:id/search_mag_icon, 不信你可以看看
但是,即便是改成后面那個也不行,還是找不到,依舊空指針,我也不知道怎么回事了。
第二種我也試過,對于我而言不行。大家都知道現在基本很多都是用appcompatActivity了,所以現在所用的主題一般也都是appcompat相關的主題了。沒有誰還在用老主題的。
即便你還在用老主題,但是,它也只是根據老主題的兩種 holo.light 、dark來改變searchview 那個搜索圖標的顏色,白色、黑色,但是根本滿足不了我們的要求。
還有,如果要用這種修改主題的方式的話,就必須使用actionbar,但是你知道現在我們都是用toolbar來替換actionbar,這個沒話說,如果在activity中直接使用setActionbar就可以了。
但是,我們在fragment里面使用toolbar呢?那就不行了,因為多數情況下,我們的主題都是 noActionbar的,因為我們要自定義toolbar呀。而且對于現在這種 一個activity下面裝多個fragment來實現那種底部導航的潮流結構中,一般我們的每個fragment的toolbar都是不一樣的,所以不可能用一個activity的toolbar來動態切換或者改變,那樣太復雜了。
第三種,親測過,也是沒有什么用,因為其實他修改的是toolbar的字體顏色,還有一些默認圖標的顏色,但是它不可以修改,searchview展開之后的搜索的框中的字體顏色
所以的所以,總而又言之就是,上述三種親測,不適用。
解決核心思路:
重點來了,既然主題什么的不行,那我們可以依照第一種方法的思路來換個角度試試。
很多時候你會發現,官方的一些組件,里面有很多成員變量或者里面有很多子view,但是只暴露出很少的方法去讓你修改一些屬性。很多是private的方法,這時候你會想如果是public該多好啊。
所以,你就會想要去繼承重寫什么的,但是那樣我覺得有點麻煩。
于是,我就想,你看,如果找到里面的子view,那不就可以通過子view來修改里面的內容了啊。比如,searchview里面的那個放大鏡的那個圖標,肯定應該是一個imageview吧,如果我們能通過什么方式找出來,那么就可以修改了嘛。
很常見的就是通過findviewbyId,所以就去找ID吧。
那么現在就要去看看源碼了,看了searchview的源碼。
id的名字你也看見了,不過它們沒有在自己的工程里,它是在support.v7里面的。
于是去里面找,找android.support.v7.appcompat.R.id.search_button就能找到了,
基本就大功告成了,然后你就通過search findviewbyid 找出來,然后就可以隨意設置了,真爽!!
其他的一些子view也是一樣,都可以找出來然后自己隨意改!
好爽!總結一下:
如果一個組件是很多子view混合構成的,你就可以通過找到子view,然后去修改子view,就能達到修改組件的效果了。
希望對大家有用,謝謝