【问题标题】:SearchView actionbar changing and search not functioningSearchView 操作栏更改和搜索不起作用
【发布时间】:2014-08-24 17:52:42
【问题描述】:

我关注google's tutorial 为 ActionBar 设置 SearchView,但遇到了一些问题。我目前正在使用 2.3.4 和 4.4.2 设备测试我的应用。

在我的 2.3.4 设备上遇到的问题

  1. 点击搜索按钮时,ActionBar 发生变化(搜索功能有效)
  2. 当您进行搜索时,它会转到预期的活动,但是当您按下后退按钮时,ActionBar 的布局会更改为问题编号 1 中 ActionBar 的预期布局,但是当您现在进行搜索时,它将无法正常工作.

在我的 4.4.2 设备上,没有问题,但作为附加问题,从搜索结果活动返回后如何折叠搜索视图?我希望清除搜索视图并将我的操作栏恢复为原始状态。

您可以在其中搜索的我的 MainActivity

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            restoreActionBar();

            //From Google tutorial
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                SearchManager searchManager =
                        (SearchManager) getSystemService(Context.SEARCH_SERVICE);
                SearchView searchView =
                        (SearchView) menu.findItem(R.id.search).getActionView();
                searchView.setSearchableInfo(
                        searchManager.getSearchableInfo(getComponentName()));
            }
            return true;

        return super.onCreateOptionsMenu(menu);
    }


 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        } else if (id == R.id.search){

            //From Google tutorial
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB) {
            //Removing this will fix problem number 1 but the search function will not work
                onSearchRequested();
            }
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

好吧,对于低 api 设备的布局变化并不是什么大问题,但搜索功能和结果后恢复操作栏更重要

【问题讨论】:

    标签: android android-actionbar searchview android-actionbar-compat


    【解决方案1】:

    最后,我找到了解决这个问题的方法。我认为谷歌教程在支持 Honeycomb API 下面的 SearchView 方面有些错误。根据教程,要为较低的 API 启用 ActionBar 搜索视图,您需要在 onOptionsItemSelected() 中添加 onSearchRequested()。但是这样会导致我上面遇到的问题。

    getActionView() 是与较低 API 不兼容的方法,我从 compat 库中找到了 MenuItemCompat.getActionView() ,该方法适用于较高和较低的 API。您现在应该删除 onSearchRequested() 以防止进一步的问题并让 getActionView() 为它工作。至于处理结果,您可以使用元数据方法(来自谷歌教程,其中有一些缺失的部分,查找另一个教程)或 searchView.setOnQueryTextListener()。

    这里是固定代码:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            restoreActionBar();
    
            SearchManager searchManager =
                    (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            MenuItem searchItem = (MenuItem) menu.findItem(R.id.search);
            SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
            searchView.setSearchableInfo(
                    searchManager.getSearchableInfo(getComponentName()));
            searchView.setOnQueryTextListener(this);
    
            return super.onCreateOptionsMenu(menu);
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        } 
       //Don't add onSearchRequested() anymore here 
    
        return super.onOptionsItemSelected(item);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多