搜尋

首頁  >  問答  >  主體

android - ToolBar中的SearchView如何让点击之后跳转到一个新的Activity

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

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

阿神阿神2772 天前1053

全部回覆(3)我來回復

  • 阿神

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

    回覆
    0
  • PHP中文网

    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);
    }

    關於「點擊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 :)

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:08:30

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

    回覆
    0
  • 取消回覆