Как отклонить клавиатуру в Android SearchView? - PullRequest
54 голосов
/ 14 сентября 2011

У меня есть searchView в ActionBar.Я хочу отклонить клавиатуру, когда пользователь закончил ввод.У меня есть следующий queryTextListener на searchView

final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
    @Override 
    public boolean onQueryTextChange(String newText) { 
        // Do something 
        return true; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) {

        showProgress();
        // Do stuff, make async call

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        return true; 
    } 
};

На основе подобных вопросов следующий код должен отклонить клавиатуру, но в этом случае он не работает:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

IТакже пробовал:

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);

Ни один не работает.Я не уверен, является ли это специфической проблемой Сота, или она связана с searchView в ActionBar, или с обоими.Кто-нибудь получил это работает или знает, почему он не работает?

Ответы [ 13 ]

66 голосов
/ 28 февраля 2013

Я пытался сделать что-то подобное. Мне нужно было запустить SearchActivity с другого Activity, чтобы поисковое слово отображалось в открытом поисковом поле при его загрузке. Я перепробовал все описанные выше подходы, но в конце концов (аналогично ответу Ридкулли выше ) я установил переменную на SearchView в onCreateOptionsMenu(), а затем в onQueryTextSubmit(), вызванную clearFocus() на SearchView, когда пользователь отправил новый поиск:

private SearchView searchView;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.search_menu, menu);
    searchView = (SearchView) menu.findItem(R.id.menu_search)
            .getActionView(); // set the reference to the searchView
    searchView.setOnQueryTextListener(this); 
    searchMenuItem = (MenuItem) menu.findItem(R.id.menu_search); 
    searchMenuItem.expandActionView(); // expand the search action item automatically
    searchView.setQuery("<put your search term here>", false); // fill in the search term by default
    searchView.clearFocus(); // close the keyboard on load
    return true;
}

@Override
public boolean onQueryTextSubmit(String query) {
    performNewSearch(query);
    searchView.clearFocus();
    return true;
}
32 голосов
/ 02 июля 2014

Просто, прямо в точку и чисто:

  @Override
  public boolean onQueryTextSubmit(String query) {
      // your search methods
      searchView.clearFocus();
      return true;
  }
20 голосов
/ 21 марта 2015

просто вернуть false на onQueryTextSubmit, как показано ниже

@Override
public boolean onQueryTextSubmit(String s) {
     return false;
}
11 голосов
/ 10 января 2012

Каким-то образом это работает, если вы звоните

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);

, а затем

otherWidget.requestFocus();
7 голосов
/ 08 декабря 2015

Для меня ничего из вышеперечисленного не работало над первым представлением. Он прятался и тут же снова показывал клавиатуру. Мне пришлось опубликовать clearFocus() в обработчике представления, чтобы это произошло после того, как это было сделано со всем остальным.

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                if (!"".equals(query)) {
                    mSearchView.post(new Runnable() {
                        @Override
                        public void run() {
                            mSearchView.clearFocus();
                        }
                    });
                }
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
7 голосов
/ 01 марта 2012

Для меня следующие работы:

В моей деятельности у меня есть переменная-член

private SearchView mSearchView;

В onCreateOptionsMenu() Я установил эту переменную так:

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.library, menu);
    mSearchView = (SearchView)menu.findItem(R.id.miSearch).getActionView();
    mSearchView.setOnQueryTextListener(this);
    return true;
}   

В QueryTextListener наконец я делаю это:

mSearchView.setQuery("", false);
mSearchView.setIconified(true); 

Я посмотрел исходный код SearchView, и если вы не сбросите текст запроса в пустую строку, SearchView просто сделает это и не удалит клавиатуру. На самом деле, углубляясь в исходный код достаточно глубоко, все сводится к тому же, предположил Юку, но все же мне больше нравится мое решение, так как мне не нужно возиться с этими низкоуровневыми вещами.

2 голосов
/ 20 августа 2013

Edit: я добавил лучшее решение сверху, но также сохранил старый ответ в качестве ссылки.

 @Override
        public boolean onQueryTextSubmit(String query) {

                  searchView.clearFocus();
            return false;
        }

Оригинальный ответ: я запрограммировал, используя setOnQueryTextListener. Когда вид поиска скрыт, клавиатура исчезает, а затем, когда она снова становится видимой, клавиатура не появляется.

    //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;
        }

     });
1 голос
/ 08 апреля 2019

Вы можете использовать его.

if (isKeybordShowing(MainActivity.this, MainActivity.this.getCurrentFocus())) {
    onBackPressed();
}

public boolean isKeybordShowing(Context context, View view) {
    try {
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
        return keyboard.isActive();
    } catch (Exception ex) {
        Log.e("keyboardHide", "cannot hide keyboard", ex);
        return false;
    }
}
1 голос
/ 12 июня 2013

Я использовал ActionBarSherlock 4.3, и у меня есть ProgressDialog. Когда я отклоняю это в методе postExecute, Searchview получает фокус. Чтобы это исправить:

//Handle intent and hide soft keyboard
    @Override
    protected void onNewIntent(Intent intent) {
        setIntent(intent);
        handleIntent(intent);
        searchView.setQuery("", false);
        searchView.setIconified(true);
        searchView.clearFocus();
    }

    /*When dismiss ProgressDialog, searchview gain focus again and shows the keyboard. I  call clearFocus() to avoid it.*/

    AsyncTask.onPostExecute(){
      if(pd!=null)
        pd.dismiss();
      if(searchView!=null)
        searchView.clearFocus();
    }

Надеюсь, это поможет.

1 голос
/ 08 июля 2012

В приложении для планшетов, над которым я работаю с двойной панелью, я написал только

f.getView().requestFocus(); // f is the target fragment for the search

и этого было достаточно, чтобы закрыть экранную клавиатуру после поиска. Нет необходимости использовать InputMethodManager

...