如何在Android中使搜索视图(SearchView)的返回按钮正常工作

4

我已经在互联网上搜索了4个多小时,想要在搜索视图打开时正确地使用返回按钮,但我无法实现。

这是我的搜索视图:

    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" />

所有这些都在一个使用SQL和一些插入、删除等方法的巨大类中完成。那么我的问题是,每当我点击搜索视图时,它会展开以便输入文本,每件事都很好,但是当我从Android上按下返回按钮时,什么也不会发生。

我尝试了2个选项,但都没有起作用,如果你能帮助我就好了....

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) { //MEJORAR ESTO
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        searchview.onActionViewCollapsed();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
//None of this 2 methods are working. I tried them separately
@Override
public void onBackPressed(){
    if (!this.searchview.isIconified()) {
        this.searchview.setIconified(true);
    } else {
        super.onBackPressed();
    }
}

这里是正确的做法:https://dev59.com/mVUM5IYBdhLWcg3wWvDF#48989340 - AndroidTank
5个回答

11

当searchView打开且按下返回按钮时,您希望看到searchView关闭(即setIconified(true))。这是根据Google应用程序搜索视图实现的标准行为。

所以你只需要做类似这样的事情

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

如果在活动中有另一个可编辑的控件(例如EditText),那么这会导致问题,因为SearchView无法再正确地获得焦点。 - fpanizza
2
在 setIconified 之前添加 setQuery("", false); 对我有用。所以我的代码看起来像这样:if (!hasFocus) { setQuery("", false); setIconified(true); } - fpanizza

4
在我的情况下,只需添加:<\p>
setFocusableInTouchMode(true);

为了解决这个问题,将SearchView作为解决方法,
希望能有所帮助,

2

尝试在菜单项上使用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;
            }
        });

虽然第一种选项不再起作用,但第二种选项明显有效。 - Mehdi Jahed Manesh

0

如果您使用支持库,请尝试使用以下代码替换this.searchview.setIconified(true):

searchview.onActionViewCollapsed();
supportInvalidateOptionsMenu();

如果您不使用支持库,则可以使用以下内容:

searchview.onActionViewCollapsed();
invalidateOptionsMenu();

0

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


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