Ответ 1
попробуйте вызвать setFocusable (false) в SearchView, когда вы его запустите.
У меня есть ActionBar с SearchView. Элементы меню скрытого/переполнения отображаются справа в раскрывающемся списке, когда выбрана кнопка меню. Когда раскрывающееся меню скрыто, SearchView фокусируется и показывает клавиатуру. Есть ли способ остановить отображение клавиатуры (за исключением случая, когда SearchView коснулся)?
С уважением, Julius.
Изменить добавленный код ниже: Вот как я его инициализирую:
SearchManager searchManager = (SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE);
((SearchView) mSearchView).setSearchableInfo(searchManager.getSearchableInfo(mActivity.getComponentName()));
mSearchView.setIconifiedByDefault(mIconified);
mSearchView.setOnQueryTextListener(this);
mSearchView.setOnCloseListener(this);
mSearchView.setFocusable(false);
mSearchView.setFocusableInTouchMode(false);
if(null!=mQuery)
mSearchView.setQuery(mQuery, false);
Изменить 2:
Вот что я делаю, когда пользователь хочет начать поиск:
@Override
public boolean onQueryTextSubmit(String query) {
// Hide keyboard
InputMethodManager imm = (InputMethodManager) mActivity.getSystemService(
FragmentActivity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mSearchView.getWindowToken(), 0);
...
mSearchView.setFocusable(false);
mSearchView.setFocusableInTouchMode(false);
return true;
}
попробуйте вызвать setFocusable (false) в SearchView, когда вы его запустите.
попробуйте вызвать mSearchView.clearFocus()
при инициализации searchView. Это работало для меня, когда у меня была аналогичная проблема.
Я создал экземпляр поиска при создании меню опций в фрагменте, и ни один из вышеперечисленных методов не работал у меня.
Тем не менее, я смог решить эту проблему, сохранив ссылку на SearchView, НЕ устанавливая значение, указанное в SearchView, в onCreateOptionsMenu(), но установив его на столбе, когда фрагмент возобновился следующим образом:
@Override
public void onResume() {
super.onResume();
getView().post(new Runnable() {
public void run() {
if (mFilterView.isIconfiedByDefault()) {
mFilterView.setIconifiedByDefault(false);
mFilterView.clearFocus();
}
}
});
}
Запросить запросFocus() для другого представления, в идеале, для просмотра результатов, например
_resultsFragment.getView().requestFocus();
Я только что вытащил свои волосы по одной и той же проблеме.
Я пробовал Android: focusable = "false". Я попробовал InputMethodManager. Я попытался создать фиктивный вид, чтобы сфокусироваться, но ничего не получилось.
Я, наконец, решил его со следующим кодом внутри onCreateOptionsMenu():
final ViewTreeObserver observer = mSearchView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override
public void onGlobalLayout() {
observer.removeOnGlobalLayoutListener(this);
mSearchView.clearFocus();
}
});
Проблема заключалась в том, что в каждой точке жизненного цикла фрагмента меню еще не было создано. Метод onCreateOptionsMenu() вызывался после onResume(), но только на некоторых устройствах, на которых я тестировал, что действительно странно.
Приведенный выше код гарантирует, что очистка фокуса выполняется после изменения фокуса при создании страницы.
Я надеюсь, что это поможет кому-то другому, это сэкономит мне много времени, чтобы узнать это с самого начала.
Когда вы настраиваете SearchView в вашем файле макета XML (если вы используете его), просто используйте это:
android:focusable="false"
При таком подходе ваш SearchView не будет получать фокус, пока вы его не коснетесь... независимо от того, где или если вы "запустили" его в своем коде, или вы спрячете свое меню, или любое другое действие, которое может не произойти в вашей отладке. Это также устраняет возможную необходимость отслеживать, куда вы звоните
setFocusable (false)//по существу делает то же самое
в вашем коде несколько раз, как предполагает принятый ответ.