Отображение мягкой клавиатуры для SearchView на ActionBar
У нас есть SearchView на ActionBar, который настроен как не обозначенный. Поскольку у нас нет содержимого в представлении до тех пор, пока пользователь не вводит что-то для поиска, было бы целесообразно дать начальный фокус SearchView и убедиться, что мягкая клавиатура готова к вводу текста пользователю, всегда нужно сначала нажать в SearchView.
Я могу настроить фокус SearchView, просто позвонив
searchView.requestFocus();
но я не могу получить мягкую клавиатуру. В другом из наших фрагментов у меня есть EditText, который мы хотим сфокусировать. Я могу заставить мягкую клавиатуру появиться там, позвонив
InputMethodManager mgr = (InputMethodManager)getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
но это просто не работает в SearchView. Это, безусловно, возможно, чтобы заставить это работать.
Ответы
Ответ 1
Дальше рылся вокруг StackOverflow, и я нашел этот вопрос:
Отключение мягкой клавиатуры
который содержит решение, которое сработало для меня:
((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).
toggleSoftInput(InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY);
Ответ 2
Я использую SearchView с setIconifiedByDefault (false). Тестирование с помощью Android 4.4.2, единственный способ заставить клавиатуру фактически показать, - это посмотреть исходный код SearchView и подражать тому, как он запрашивал клавиатуру. Я пробовал буквально каждый другой метод, который мог найти/подумать, и это единственный способ, которым я мог бы заставить клавиатуру показать надежно. К сожалению, мой метод требует некоторого отражения.
В onCreateOptionsMenu (Меню):
searchView.requestFocus();
searchView.post(new Runnable() {
@Override
public void run() {
showSoftInputUnchecked();
}
});
И затем создайте метод вызова скрытого метода "showSoftInputUnchecked" в InputMethodManager:
private void showSoftInputUnchecked() {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
Method showSoftInputUnchecked = null;
try {
showSoftInputUnchecked = imm.getClass()
.getMethod("showSoftInputUnchecked", int.class, ResultReceiver.class);
} catch (NoSuchMethodException e) {
// Log something
}
if (showSoftInputUnchecked != null) {
try {
showSoftInputUnchecked.invoke(imm, 0, null);
} catch (IllegalAccessException e) {
// Log something
} catch (InvocationTargetException e) {
// Log something
}
}
}
}
Как и во всех решениях, которые используют методы доступа не в общедоступном API, я не могу обещать, что это не сломается с новыми версиями Android.
Ответ 3
Попробуйте добавить onFocusChangeListener
к вашему SearchView
- он работал у меня с EditText
:
searchView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
});
Также убедитесь, что в xml нет тега фокуса запроса на SearchView
, иначе ваш слушатель не будет вызываться.
Ответ 4
У меня есть аналогичная проблема, в которой ни одно из предлагаемых решений не работало. Некоторые просто не отображали клавиатуру, а некоторые отображали клавиатуру, но нажатие клавиши там просто не работает.
Единственное, что сработало:
// hack for making the keyboard appear
searchView.setIconified(true);
searchView.setIconified(false);
Ответ 5
Это сработало для меня.
private SearchView mSearchView;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
MenuItem searchItem = menu.findItem(R.id.action_search);
mSearchView =
(SearchView) searchItem.getActionView();
mSearchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_search) {
mSearchView.setIconifiedByDefault(true);
mSearchView.setFocusable(true);
mSearchView.setIconified(false);
mSearchView.requestFocusFromTouch();
}
return super.onOptionsItemSelected(item);
}
Ответ 6
Использовать метод expandView:
Ваш onCreateOptionsMenu может быть примерно таким:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Used to put dark icons on light action bar
final SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());
MenuItem mitem = menu.add("Search");
mitem.setIcon(ic_search_inverse)
.setActionView(searchView)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
mitem.expandActionView();
listsearch.setOnItemClickListener(this);
return true;
}
Ответ 7
Вы можете попробовать, что я сделал. Это хорошо сработало для меня.
//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
* 4 = INVISIBLE
* 0 = VISIBLE
*/
searchView.setVisibility(4);
searchView.setVisibility(0);
return false;
}
});