安卓ActionBarSherlock,SearchView的`setOnCloseListener`无法正常工作

6

我正在使用SearchView,它工作得很好,但是只有setOnCloseListener没有起作用。这是我的代码:

import com.actionbarsherlock.widget.SearchView.OnCloseListener;

并且。
searchView.setOnCloseListener(new OnCloseListener() {
            @Override
            public boolean onClose() {

                Toast.makeText(context, "close", Toast.LENGTH_SHORT).show();
                return false;
            }
        });

**EDIT****

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //Used to put dark icons on light action bar
        //Create the search view
        final SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());
        searchView.setQueryHint("Search");
        searchView.setIconifiedByDefault(true);

    //search button
    menu.add(Menu.NONE,Menu.NONE,1,"Search a word")
        .setIcon(R.drawable.abs__ic_search_api_holo_light)
        .setActionView(searchView)
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

        MenuItem sView =  menu.findItem(1);

        sView.setOnActionExpandListener(this);

return true;

}

    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
        adopter.getFilter().filter(null);
        Toast.makeText(getApplicationContext(), "collapse", Toast.LENGTH_LONG).show();
        return true; // Return true to collapse action view
    }

    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {
        Toast.makeText(getApplicationContext(), "Expand", Toast.LENGTH_LONG).show();
        return true; // Return true to expand action view
    }

你试过我的答案了吗? - flx
请查看我的编辑后的答案,它无法工作。 - Androider
4个回答

18

我自己解决了。只需删去 setOnCloseListener 就可以了,在 onCreateOptionsMenu 中添加以下代码:

//        searchView.setOnCloseListener(new OnCloseListener() { 
//          @Override
//          public boolean onClose() {
//              adapter.getFilter().filter("");
//              Toast.makeText(getBaseContext(), "on close", Toast.LENGTH_SHORT).show(); 
//              return false;
//          }
//      });

        MenuItem menuItem = menu.findItem(ID_OF_SEARCHVIEW);
        menuItem.setOnActionExpandListener(new OnActionExpandListener() {   
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                adapter.getFilter().filter("");
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                adapter.getFilter().filter("");
                return true;
            }
        });

2

我也遇到了SearchView的onCloseListener不起作用的问题。 根据25758中提出的错误问题和我阅读过的一些帖子,要想调用onCloseListener,你需要设置:

searchView.setIconifiedByDefault(true);

但是对于我的情况,我希望搜索视图一直处于打开状态而不是被隐藏。我通过在下面添加一行代码来解决这个问题:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.search_bar, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setOnQueryTextListener(queryTextListener);
    searchView.setIconifiedByDefault(true);
    searchView.setIconified(false);
    return true;
}

searchView.setIconified(false)将导致searchView打开,尽管在前一行设置默认为true。通过这种方式,我成功地拥有了一个始终打开的SearchView,并使其调用onCloseListener。


这几乎是完美的,但看起来我现在不能让这个东西不自动对焦并在活动启动时启动键盘。 - Daniel Wilson

1
我正在使用这段代码。它完美地运行着。
    @Override
    public void onStartSearch() {
    }

    @Override
    public void onSearch(String search) {

    }

    @Override
    public void onCloseSearch() {
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.your_menu, menu);

        // Associate searchable configuration with the SearchView
        MenuItem searchItem = menu.findItem(R.id.action_search);
        mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem); //here I user appcompat, but you can take it just from actionbarsherlock

        SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) mSearchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
        searchAutoComplete.setTextColor(getResources().getColor(R.color.action_bar_text_color));

        mSearchView.setIconifiedByDefault(true);
        mSearchView.setSubmitButtonEnabled(false);

        /**
         * Set all of different kinds of listeners
         */
        MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                menuIsOpen = false;
                onCloseSearch();
                return true;
            }

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                menuIsOpen = true;
                onStartSearch();
                return true;
            }
        });

        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String s) {
                onSearch(s);
                return false;
            }

            @Override
            public boolean onQueryTextSubmit(String s) {
                onSearch(s);
                return true;
            }
        });

        super.onCreateOptionsMenu(menu, inflater);
    }

/**
     * Function for closing search when android is less than 14
     */
    public boolean onBackButton() {
        if (AndroidUtils.getSdkVersion() >= 14)
            return false;

        if (menuIsOpen) {
            menuIsOpen = false;
            getActivity().supportInvalidateOptionsMenu();
            onCloseSearch();
            return true;
        }
        return false;
    }

点击后退按钮可以关闭搜索,或者从操作栏中选择关闭。

0
您可以使用 OnActionExpandListener:
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
  SearchView searchView = new SearchView(((SherlockFragmentActivity) getActivity()).getSupportActionBar().getThemedContext());
  searchView.setIconifiedByDefault(true);
  // ...
  MenuItem menuItem = menu.add(R.string.search);
  // ...
  menuItem.setOnActionExpandListener(this);
}

@Override
public boolean onMenuItemActionExpand(final MenuItem item) {
    mInSearchMode = true;
    return true;
}

@Override
public boolean onMenuItemActionCollapse(final MenuItem item) {
    mInSearchMode = false;
    return true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接