现在在研究Toolbar,碰到一个问题。
ToolBar上有一个SearchView,就是那个放大镜,如何做才能让他像微信那样点击SearchView之后跳转到一个新的Activity(Fragment?)
加一个点击事件吗?还是Toolbar中本身就有这种属性?
新手学习中,望大神不吝赐教,谢谢!
阿神2017-04-17 13:08:30
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,應該就是這樣做的
java
@Override public boolean onCreateOptionsMenu(Menu menu){ new MenuInflater(this).inflate(R.menu.yousuu_menu,menu); MenuItem searchViewButton = (MenuItem) menu.findItem(R.id.menu_search); searchViewButton.setClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent= new Intent(MainActivity.this,SearchActivity.class); startActivity(intent); } }); // others }
其實以前沒有actionViewClass的時候大家都是這麼做的。
PHP中文网2017-04-17 13:08:30
@李引證 的回答包括了關鍵訊息,我來補充一些細節,及糾正幾個細節上的錯誤。
我們需要覆寫 onCreateOptionsMenu
來初始化Activity/Fragment的選項選單。
Android同時提供了另一個方法 onOptionsItemSelected()
,該方法在選單項目被點擊時調用,在這裡處理選單項目的點擊事件。所以一般不會在 onCreateOptionsMenu
為某個item實現其callback.
需要修正的是,MenuItem沒有setClickListener
,而是MenuItem.setOnMenuItemClickListener
.
所以,我們通常會這樣去做:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_start_search_activity, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_search:
startActivity(new Intent(StartSearchActivity.this, PhotoGalleryActivity.class));
return true;
}
return super.onMenuItemSelected(featureId, item);
}
當我們想為一個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 :)