在 Toolbar與menu結(jié)合使用總結(jié) 這篇文中了解了Toolbar中menu的使用睦疫,本文中的SearchView也屬于menu的使用判耕,但又有一點(diǎn)不同柑蛇,所以單獨(dú)記下來(lái)。
- 首先還是創(chuàng)建menu:
search.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/toolbar_search"
android:title="search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always" />
</menu>
注意兆龙,這里設(shè)置的app:actionViewClass="android.support.v7.widget.SearchView"
搜索圖標(biāo)默認(rèn)是黑色的杖爽,包括輸入框中的文字以及關(guān)閉圖標(biāo)都是黑色的,嘗試了很多奇怪的招數(shù)都沒(méi)能成功改變顏色紫皇,最后才發(fā)現(xiàn)SearchView的樣式是在Toolbar的主題中設(shè)置的掂林,可以參考Toolbar的使用經(jīng)驗(yàn)總結(jié) 最后一部分。
- 創(chuàng)建SearchActivity,重寫(xiě)創(chuàng)建菜單方法:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.toolbar_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return true;
}
其實(shí)寫(xiě)到這里已經(jīng)可以實(shí)現(xiàn)搜索功能了坝橡,只要監(jiān)聽(tīng)Enter鍵,然后searchView.getQuery()
獲取搜索框中輸入的內(nèi)容就可以了精置。
但我們要用高端一點(diǎn)的實(shí)現(xiàn)方式(雖然寫(xiě)起來(lái)有點(diǎn)復(fù)雜)计寇。
- 創(chuàng)建searchable文件
在res目錄下新建xml文件夾,在文件夾中創(chuàng)建searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="姓名"
android:imeOptions="actionSearch"
android:label="@string/app_name">
</searchable>
- 配置Manifest
<!--搜索界面-->
<activity android:name=".SearchActivity">
<meta-data
android:name="android.app.default_searchable"
android:value=".SearchResultActivity" />
<!--如果搜索結(jié)果在同一界面脂倦,則只需要以下配置-->
<!--<meta-data-->
<!--android:name="android.app.searchable"-->
<!--android:resource="@xml/searchable" />-->
<!--<intent-filter>-->
<!--<action android:name="android.intent.action.SEARCH" />-->
<!--</intent-filter>-->
</activity>
如果搜索結(jié)果在不同界面番宁,則可以創(chuàng)建一個(gè)SearchResultActivity,然后進(jìn)行配置:
<!--搜索結(jié)果界面-->
<activity
android:name=".SearchResultActivity"
android:parentActivityName=".SearchActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".SearchActivity" />
<!-- meta tag and intent filter go into results activity -->
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
</activity>
可以通過(guò) getIntent().getStringExtra(SearchManager.QUERY);
來(lái)獲取搜索框中輸入的內(nèi)容,然后就可以實(shí)現(xiàn)搜索了赖阻。
- SearchView 改變圖標(biāo)以及文字顏色的另類方法
為改變SearchView的顏色做了很多嘗試,由于不了解SearchView的相關(guān)屬性蝶押,所以去看了一下源碼,發(fā)現(xiàn)它并沒(méi)有提供圖標(biāo)及文字顏色等相關(guān)屬性的設(shè)置方法火欧,于是想要重寫(xiě)SearchView,但它里面的控件都是私有的也沒(méi)有提供獲取方法棋电,實(shí)現(xiàn)起來(lái)也比較麻煩茎截,于是最后出現(xiàn)這樣的實(shí)現(xiàn)方式:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.toolbar_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
//搜索圖標(biāo)的id是在SearchView的源碼中找到的卵凑,同樣可以找到其他控件的id,并進(jìn)行設(shè)置
ImageView searchBtn = searchView.findViewById(R.id.search_button);
searchBtn.setImageResource(R.drawable.ic_search_white_24dp);
return true;
}
這種方法也可以實(shí)現(xiàn)顏色的改變紧唱,雖然看起來(lái)好像有點(diǎn)奇怪顶籽,但不妨礙它確實(shí)能達(dá)到目的粥脚。所以菇曲,如果以后再碰到類似這種不知道在哪設(shè)置屬性的情況可以嘗試這種方法夏跷。