當我們想為一個activity添加搜尋框(換句話說就是點擊action bar menu item,然後在action bar上彈出搜尋框),一般做法是把該activity(也就是包含了search menu item的activity)配置為可搜索,然後再實現相應的方法。 根據menu item是否配置了android:actionViewClass="android.widget.SearchView",對應的方法(onCreateOptionsMenu, onOptionsItemSelected)在實作上有些差異。 結果上也有差別,前者是在action bar上覆蓋一個搜尋對話框,後者俱有和應用完全一致的樣式和主題,如下圖:
ToolBar可以當ActionBar使用,所以當你在Activity onCreate裡
setSupportActionBar(toolbar);
之後就可以直接用actionbar的操作方式了,當然,之前的那些導航是不能再用了。SearchView這種應該是定義在menu上的,在
onCreateOptionsMenu(Menu menu)
裡的inflate掛載好meunu.xml檔案裡以後,你可以透過MenuItem searchViewButton = (MenuItem) menu.findItem(R.id.menu_search);
來取得這個按鍵,然後你自然就可以給它綁各種事件了,像是說什麼onClickListener之類的。這樣你想跳轉啥activity,只要開個intent就可以跳了,一切隨你自己心意。
不過一般使用SearchView都是在menu.xml裡加個
android:actionViewClass="android.widget.SearchView"
,這樣點擊放大鏡的時候只會改變actionbar的區域,算是google推薦的最佳實踐。另外也推薦
searchView.setSearchableInfo(searchManager)
來跳到搜尋結果的activity。PS:我的微信點擊SearchView似乎沒有跳轉,只是多了一層陰影。
剛剛試了最新版微信,果然是跳到新的Activity,應該就是這樣做的
其實以前沒有actionViewClass的時候大家都是這麼做的。
@李引證 的回答包括了關鍵訊息,我來補充一些細節,及糾正幾個細節上的錯誤。
關於「選單項目的點擊事件」
我們需要覆寫
onCreateOptionsMenu
來初始化Activity/Fragment的選項選單。Android同時提供了另一個方法
onOptionsItemSelected()
,該方法在選單項目被點擊時調用,在這裡處理選單項目的點擊事件。所以一般不會在onCreateOptionsMenu
為某個item實現其callback.需要修正的是,MenuItem沒有
setClickListener
,而是MenuItem.setOnMenuItemClickListener
.所以,我們通常會這樣去做:
關於「點擊SearchView後跳到一個新的Activity」
當我們想為一個activity添加搜尋框(換句話說就是點擊action bar menu item,然後在action bar上彈出搜尋框),一般做法是把該activity(也就是包含了search menu item的activity)配置為可搜索,然後再實現相應的方法。
根據menu item是否配置了
android:actionViewClass="android.widget.SearchView"
,對應的方法(onCreateOptionsMenu
,onOptionsItemSelected
)在實作上有些差異。結果上也有差別,前者是在action bar上覆蓋一個搜尋對話框,後者俱有和應用完全一致的樣式和主題,如下圖:
所以,如果你想點擊SearchView後跳到一個新的Activity,就像微信搜尋框的效果。
需要這樣做:
首先配置這個新的Activity為可搜尋的Activity,並實現其對應的方法;
參考(1)配置一個Searchable Activity;發起搜尋請求;在onNewIntent中處理search intent;(2)使用SearchView作為search menu item的指定視圖。
然後為某一個Activity新增MenuItem,在Item的點擊事件中(參考上述:關於「選單項目的點擊事件」),啟動上面配置的activity;
所以,需要修正的是,這個item就是普通的item,不是具有SearchView視圖的item,你的問題表述在這一點上是錯誤的。 參考 啟動一個可搜尋的Activity;啟動一個可搜尋的activity,透過MenuItem。
同時要注意,需要呼叫
searchView.setIconifiedByDefault(false)
,這樣啟動的這個可搜尋的activity的searchView才是展開的,如下GIF效果:Done :)
多謝樓上大俠,解決了我的問題