찾다

 >  Q&A  >  본문

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

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

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

阿神阿神2772일 전1055

모든 응답(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
  • 취소회신하다