Автоматическое сворачивание ActionBar SearchView на Soft Keyboard close
В настоящее время я использую элемент меню ActionBar для отображения SearchView в панели действий. Когда элемент меню поиска расширяется, отображается мягкая клавиатура, которую я хочу. Теперь, когда пользователь нажимает кнопку "Назад", чтобы закрыть мягкую клавиатуру, я также хотел бы свернуть SearchView в панели действий.
Я попытался реализовать следующие прослушиватели OnKeyListener и OnFocusChangeListener в MenuItem и ActionView. Я также попытался использовать OnBackPressed() в Activity. Ничего из вышеперечисленного не обнаружено, если кнопка закрытия используется для закрытия мягкой клавиатуры.
Любые идеи?
Я реализовал OnActionExpandListener, чтобы знать, когда видна SearchView.
Ответы
Ответ 1
Я буду расшифровывать на @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);
}
}
});
Ответ 2
Я нашел лучшее решение.
searchView.setOnQueryTextFocusChangeListener().
OnQueryTextFocusChangeListener
вызывается, когда клавиатура отображается или скрыта. Получает вызов сначала, когда отображается клавиатура, и окно поиска будет иметь фокус. Возвращается снова, когда keyboard
скрыт, а поиск в режиме просмотра потеряет фокус, может close search view
, затем используя
menuItem.collapseActionView().
Ответ 3
Просто переопределить 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" глобальными переменными для активности.
Ответ 4
Ответ от Джона Уиллиса отлично работает. Это улучшение его ответа.
Сначала создайте новый класс, который реализует 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));
Ответ 5
Это то, что я сделал для того, чтобы клавиатура исчезла. Вы можете попытаться выяснить, работает ли это для вас. Я установил 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;
}
});
Ответ 6
Это можно сделать следующим образом:
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 не потерял фокус при отправке, вероятно, потому, что я выполняю поиск в том же самом действии, который содержит Search Search.
Во всяком случае, я думаю, что использование OnQueryTextListener более корректно, так как оно описывает событие отправки текста более точно.
Ответ 7
Вам нужно только поместить атрибут "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, чтобы закрыть клавиатуру после отправки запроса.
Ответ 8
@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);
}
Ответ 9
Если вы хотите свернуть клавиатуру, когда пользователь нажимает значок поиска на клавиатуре
это может быть достигнуто простым
inside onquerytextsubmitted {
searchView.clearfocus()
}
Ответ 10
Вам нужно дважды вызвать setIconified.
Чтобы фактически свернуть ваш поиск и закрыть клавиатуру.
С первым текстом запроса поиска открывается с помощью второй клавиатуры вызова, а окно поиска закрывается.
Ответ 11
По какой-то причине 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);
}
}
});