В настоящее время я использую элемент меню ActionBar для отображения SearchView на панели действий. Когда пункт меню поиска раскрывается, отображается мягкая клавиатура, чего я и хочу. Теперь, когда пользователь нажимает кнопку «Назад», чтобы закрыть программную клавиатуру, я также хотел бы свернуть SearchView на панели действий.
Я пробовал реализовать следующие слушатели OnKeyListener и OnFocusChangeListener в MenuItem и ActionView. Я также пробовал использовать OnBackPressed () в Activity. Ни одно из вышеперечисленных действий не определяет, когда кнопка «Назад» используется для закрытия программной клавиатуры.
Есть идеи?
Я реализовал OnActionExpandListener, чтобы знать, когда виден SearchView.
android
android-actionbar
android-softkeyboard
user1258568
источник
источник
Ответы:
Я расширю ответ @ user1258568 для ленивых. Это сработало для меня. Обратите внимание, что он очищает ваш запрос при потере фокуса.
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); } } });
источник
menu.getItem(yourSearchViewItemPosition)
вместо него.setOnFocusChangeListener()
вместо негоsetOnQueryTextFocusChangeListener()
. С вашим методом все работает нормально. Спасибо.Я нашел лучшее решение.
searchView.setOnQueryTextFocusChangeListener().
OnQueryTextFocusChangeListener
Вызывается при отображении или скрытой клавиатуры. Вызывается первым, когда отображается клавиатура и фокус в представлении поиска. Вызывается снова, когдаkeyboard
он скрыт, и вид поиска теряет фокус,close search view
затем можно использоватьmenuItem.collapseActionView().
источник
OnQueryTextFocusChangeListener
Не вызывается при отображении или скрытой клавиатуры. Он вызывается только тогда, когдаsearchView
появляется в фокусе или не в фокусе. Итак, когдаSearchView
в первый раз в фокусе,OnQueryTextFocusChangeListener
вызывается и отображается клавиатура. Теперь, если нажать кнопку «Назад», клавиатура скрывается, ноOnQueryTextFocusChangeListener
не вызывается. При повторном нажатии кнопки "Назад"searchView
сворачивается иOnQueryTextFocusChangeListener
вызывается.Просто переопределите onBackPressed вот так:
@Override public void onBackPressed() { if (searchView.isShown()){ searchView.onActionViewCollapsed(); //collapse your ActionView searchView.setQuery("",false); //clears your query without submit isClosed = true; //needed to handle closed by back } else{ super.onBackPressed(); } }
и ваш onCreateOptionsMenu раздувает mSearchView следующим образом:
@Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu_search, menu); mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView(); mSearchView.setOnQueryTextListener(this); mSearchView.setOnSearchClickListener(this); mSearchView.setOnCloseListener(this); isClosed = true; return true; }
вы реализуете в классе следующее:
public class myActivity extends FragmentActivity implements SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener {
которые вам также понадобятся:
@Override public void onClick(View view) { isClosed = false; } @Override public boolean onClose() { isClosed = true; return false; }
Вам нужно будет сделать "mSearchView" и "isClosed" обеими глобальными переменными для действия.
источник
Ответ Джона Уиллиса отлично работает. Это улучшение его ответа.
Сначала создайте новый класс, который реализует
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); } } } }
Затем установите слушателя на свой
SearchView
:searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));
источник
Вам нужно только добавить атрибут collapseActionView в макет меню.
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_item_search" android:title="@string/search" android:iconifiedByDefault="true" android:icon="@drawable/ic_action_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom|collapseActionView"/> <--this one </menu>
Это даст вам функциональность, которую вы сами ищете. Не забудьте вызвать метод clearFocus в SearchView, чтобы закрыть клавиатуру после отправки запроса.
источник
Вот что я сделал, чтобы клавиатура исчезла. Вы можете попробовать проверить, работает ли это для вас. Я установил
searchView
невидимый, а затем снова видимый.//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; } });
источник
Достичь этого можно так:
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; } }); }
Решения, основанные на setOnQueryTextFocusChangeListener (), у меня не работали, потому что событие не было запущено - searchView не терял фокус при отправке, вероятно, потому, что я выполняю поиск в том же действии, которое содержит представление поиска.
Во всяком случае, я думаю, что использование OnQueryTextListener более правильно, так как оно более точно описывает событие отправки текста.
источник
@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); }
источник
Если вы хотите свернуть клавиатуру, когда пользователь щелкает значок поиска на клавиатуре, это может быть достигнуто простым
inside onquerytextsubmitted {
searchView.clearfocus()
}
источник
Вам нужно дважды вызвать setIconified.
Чтобы свернуть окно поиска и закрыть клавиатуру.
При первом вызове текст окна поиска очищается, при втором вызове клавиатура и окно поиска закрывается.
источник
По какой-то причине
menuItem.collapseActionView()
не получилось, поэтому использовалsearchView.setIconified(true)
вместо него.Это дает результат ниже в качестве образца кода.
final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search); final SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { searchView.setIconified(true); } } });
источник