SearchView操作栏更改和搜索功能不正常

时间:2014-08-24 17:52:42

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

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

我的2.3.4设备上遇到的问题

  1. 单击搜索按钮时ActionBar会更改(搜索功能有效) enter image description here
  2. 当你进行搜索时,它会转到预期的活动,但是当你按下后退按钮时,ActionBar的布局会更改为问题编号1中ActionBar的预期布局,但是当你现在进行搜索时,它不会工作。 enter image description here
  3. 在我的4.4.2设备上,没有任何问题,但作为一个额外的问题,如何在从搜索结果活动返回后折叠搜索视图?我希望清除searchview并将我的操作栏恢复原状。

    我可以搜索的主要活动

     @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设备的布局变化并不是什么大问题,但搜索功能和在结果后恢复操作栏更为重要

1 个答案:

答案 0 :(得分:0)

最后,我找到了解决这个问题的方法。我认为google教程在支持Honeycomb API下的SearchView方面有些不对劲。根据教程,要为较低的API启用ActionBar searchview,您需要在onOptionsItemSelected()中添加onSearchRequested()。但是,这将导致我遇到的问题。

getActionView()是与低级API不兼容的方法,我从compat库中找到了MenuItemCompat.getActionView(),它适用于更高和更低的API。您现在应该删除onSearchRequested()以防止进一步的问题,并让getActionView()为它工作。至于处理结果,您可以使用元数据方法(来自Google教程,其中包含一些缺失的部分,找到另一个教程)或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);
}