Auto Collapse ActionBar SearchView on Soft Keyboard close

后端 未结 11 989
遥遥无期
遥遥无期 2020-12-07 20:30

I am currently using an ActionBar menu item to display a SearchView in the action bar. When the search menu item is expanded the soft keyboard is displayed which is what I

相关标签:
11条回答
  • 2020-12-07 20:47

    I'll expand on @user1258568 's answer for the lazy. This worked for me. Note that it clears your query when focus is lost.

    final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search);
    final SearchView searchView = (SearchView) searchMenuItem.getActionView();
    
    searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View view, boolean queryTextFocused) {
            if(!queryTextFocused) {
                searchMenuItem.collapseActionView();
                searchView.setQuery("", false);
            }
        }
    });
    
    0 讨论(0)
  • 2020-12-07 20:47
    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getSupportMenuInflater().inflate(R.menu.home_screen, menu);
    
            SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            final MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
            final SearchView searchView = (SearchView) searchMenuItem
                    .getActionView();
            searchView.setIconifiedByDefault(false);
            if (searchManager != null && searchView != null) {
                searchView.setSearchableInfo(searchManager
                        .getSearchableInfo(getComponentName()));
    
                searchView
                        .setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
    
                            @Override
                            public void onFocusChange(View v, boolean hasFocus) {
    
                                if (!hasFocus) {
                                    if (searchMenuItem != null) {
                                        searchMenuItem.collapseActionView();
                                    }// end if
                                    if (searchView != null) {
                                        searchView.setQuery("", false);
    
                                    }// end if
                                }// end if
    
                            }
                        });
    
                searchView
                        .setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    
                            @Override
                            public boolean onQueryTextSubmit(String query) {
                                /**
                                 * hides and then unhides search tab to make sure
                                 * keyboard disappears when query is submitted
                                 */
                                if (searchView != null) {
                                    searchView.setVisibility(View.INVISIBLE);
                                    searchView.setVisibility(View.VISIBLE);
    
                                }
                                return false;
                            }
    
                            @Override
                            public boolean onQueryTextChange(String newText) {
                                // TODO Auto-generated method stub
                                return false;
                            }
                        });
    
            }
    
            return super.onCreateOptionsMenu(menu);
        }
    
    0 讨论(0)
  • 2020-12-07 20:55

    The answer from Jon Willis works great. This is an improvement to his answer.

    First, create a new class that implements View.OnFocusChangeListener:

    public class SearchViewFocusListener implements View.OnFocusChangeListener {
    
        private final MenuItem mMenuItem;
    
        public SearchViewFocusListener(MenuItem menuItem) {
            mMenuItem = menuItem;
        }
    
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                mMenuItem.collapseActionView();
                if (v instanceof SearchView) {
                    ((SearchView) v).setQuery("", false);
                }
            }
        }
    
    }
    

    Next, set the listener on your SearchView:

    searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));
    
    0 讨论(0)
  • 2020-12-07 20:55

    This is what I did for making the keyboard disappear. You can try to see if this works for you. I set the searchView to invisible and then to visible again.

        //set query change listener
         searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
            @Override
            public boolean onQueryTextChange(String newText) {
                // TODO Auto-generated method stub
                return false;
            }
    
            @Override
            public boolean onQueryTextSubmit(String query) {
                /**
                 * hides and then unhides search tab to make sure keyboard disappears when query is submitted
                 */
                      searchView.setVisibility(View.INVISIBLE);
                      searchView.setVisibility(View.VISIBLE);
                return false;
            }
    
         });
    
    0 讨论(0)
  • 2020-12-07 20:56

    I found a better solution.

    searchView.setOnQueryTextFocusChangeListener(). 
    

    The OnQueryTextFocusChangeListener gets called when the keyboard is displayed or hidden. Gets called first when the keyboard is displayed and the search view will have focus. Gets called again when keyboard is hidden and search view will lose focus, can close search viewthen using

    menuItem.collapseActionView().
    
    0 讨论(0)
  • 2020-12-07 20:59

    It's achievable like this:

       private void setupSearchView(Menu menu) {
            final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
            final SearchView searchView = (SearchView) searchMenuItem.getActionView();
    
            [...]
    
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    searchMenuItem.collapseActionView();
                    return false;
                }
                @Override
                public boolean onQueryTextChange(String newText) {
                    return true;
                }
            });
        }
    

    Solutions based on setOnQueryTextFocusChangeListener() did not work for me because the event was not launched - the searchView did not lose focus when submitted, probably because I perform the search in the same activity that contains the Search View.

    Anyway, I think using OnQueryTextListener is more correct, as it describes the event of submitting text more precisely.

    0 讨论(0)
提交回复
热议问题