android - ToolBar中的SearchView如何让点击之后跳转到一个新的Activity
阿神
阿神 2017-04-17 13:06:30
0
3
1052

现在在研究Toolbar,碰到一个问题。
ToolBar上有一个SearchView,就是那个放大镜,如何做才能让他像微信那样点击SearchView之后跳转到一个新的Activity(Fragment?)
加一个点击事件吗?还是Toolbar中本身就有这种属性?

新手学习中,望大神不吝赐教,谢谢!

阿神
阿神

闭关修行中......

全部回覆(3)
阿神

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的時候大家都是這麼做的。

Ty80

@李引證 的回答包括了關鍵訊息,我來補充一些細節,及糾正幾個細節上的錯誤。

關於「選單項目的點擊事件」

我們需要覆寫 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);
}

關於「點擊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,就像微信搜尋框的效果。
需要這樣做:

  1. 首先配置這個新的Activity為可搜尋的Activity,並實現其對應的方法;
    參考(1)配置一個Searchable Activity;發起搜​​尋請求;在onNewIntent中處理search intent;(2)使用SearchView作為search menu item的指定視圖。

  2. 然後為某一個Activity新增MenuItem,在Item的點擊事件中(參考上述:關於「選單項目的點擊事件」),啟動上面配置的activity;
    所以,需要修正的是,這個item就是普通的item,不是具有SearchView視圖的item,你的問題表述在這一點上是錯誤的。 參考 啟動一個可搜尋的Activity;啟動一個可搜尋的activity,透過MenuItem。

  3. 同時要注意,需要呼叫searchView.setIconifiedByDefault(false),這樣啟動的這個可搜尋的activity的searchView才是展開的,如下GIF效果:

Done :)

伊谢尔伦

多謝樓上大俠,解決了我的問題

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板