在Android中使用searchview时,如何使“返回”按钮正常工作

在Android中使用searchview时,如何使“返回”按钮正常工作,android,searchview,Android,Searchview,我已经在互联网上搜索了4个多小时,如何在打开searchview时让后退按钮正常工作,但我就是无法实现 这是我的搜索视图 searchview = (SearchView) findViewById(R.id.searchView); searchview.setOnClickListener(this); @Override public void onClick(View v) { if (v.getId() == R.id.search

我已经在互联网上搜索了4个多小时,如何在打开searchview时让后退按钮正常工作,但我就是无法实现

这是我的搜索视图

    searchview  = (SearchView) findViewById(R.id.searchView);
        searchview.setOnClickListener(this);
  @Override
    public void onClick(View v) {
        if (v.getId() == R.id.searchView){

           //Cursor cursor = manager.obtenerIDColumnaServicio(searchview.getQuery().toString());
            adapterOfDataBase.changeCursor(cursor);
        }
    }
以下是xml:

   <SearchView
                    android:layout_width="match_parent"
                    android:layout_height="63dp"
                    android:id="@+id/searchView"
                    android:iconifiedByDefault="true"
                    android:backgroundTint="#ff000000"
                    android:layout_marginRight="0dp" />

如果您正在使用支持库,请尝试以下方法,而不是使用此.searchview.SetIconnified(true):

searchview.onActionViewCollapsed();
supportInvalidateOptionsMenu();
searchview.onActionViewCollapsed();
invalidateOptionsMenu();
如果不使用支持库,请执行以下操作:

searchview.onActionViewCollapsed();
supportInvalidateOptionsMenu();
searchview.onActionViewCollapsed();
invalidateOptionsMenu();

当searchView打开并按下后退按钮时,您希望看到searchView关闭(也称为SetIconnified(true)),这是google apps searchView实现的标准行为

所以你需要做的就是这样

    mSearchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                mSearchView.setIconified(true);
            }
        }
    });

就我而言,我只是补充:

setFocusableInTouchMode(true);
将SearchView作为此问题的解决方案


希望有帮助,

尝试在MenuItem上使用OnActionExpandListener

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_search, menu);
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        MenuItem searchItem = menu.findItem(R.id.search);
        SearchView searchView = null;
        if (searchItem != null) {
            searchView = (SearchView) searchItem.getActionView();
        }
        if (searchView != null) {
            searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName()));
        }
        searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                return true;
            }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // TODO do your stuff when back button is pressed
            return true;
        }
    });
    return super.onCreateOptionsMenu(menu);
}
如果您使用AppCompatSupportv7

MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                // TODO do your stuff when back button is pressed
                return true;
            }
        });

从Android 9开始,Google自己解决了这个问题。

如果活动中有另一个可编辑控件(即EditText),那么SearchView将无法正确获取焦点。添加一个setQuery(“,false);在为我工作之前。因此,我的代码如下所示:if(!hasFocus){setQuery(“,false);setIconified(true);}虽然第一个选项不再有效,但第二个选项显然有效。下面是正确的方法: