Подтвердить что ты не робот

SearchView сфокусировался при скрытии меню ActionBar

У меня есть 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;
    }
4b9b3361

Ответ 1

попробуйте вызвать setFocusable (false) в SearchView, когда вы его запустите.

Ответ 2

попробуйте вызвать mSearchView.clearFocus() при инициализации searchView. Это работало для меня, когда у меня была аналогичная проблема.

Ответ 3

Я создал экземпляр поиска при создании меню опций в фрагменте, и ни один из вышеперечисленных методов не работал у меня.

Тем не менее, я смог решить эту проблему, сохранив ссылку на SearchView, НЕ устанавливая значение, указанное в SearchView, в onCreateOptionsMenu(), но установив его на столбе, когда фрагмент возобновился следующим образом:

@Override
public void onResume() {
    super.onResume();
    getView().post(new Runnable() {
        public void run() {
            if (mFilterView.isIconfiedByDefault()) {
                mFilterView.setIconifiedByDefault(false);
                mFilterView.clearFocus();
            }
        }
    });
}

Ответ 4

Запросить запросFocus() для другого представления, в идеале, для просмотра результатов, например

_resultsFragment.getView().requestFocus();

Ответ 5

Я только что вытащил свои волосы по одной и той же проблеме.

Я пробовал 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(), но только на некоторых устройствах, на которых я тестировал, что действительно странно.

Приведенный выше код гарантирует, что очистка фокуса выполняется после изменения фокуса при создании страницы.

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

Ответ 6

Когда вы настраиваете SearchView в вашем файле макета XML (если вы используете его), просто используйте это:

android:focusable="false"

При таком подходе ваш SearchView не будет получать фокус, пока вы его не коснетесь... независимо от того, где или если вы "запустили" его в своем коде, или вы спрячете свое меню, или любое другое действие, которое может не произойти в вашей отладке. Это также устраняет возможную необходимость отслеживать, куда вы звоните

setFocusable (false)//по существу делает то же самое

в вашем коде несколько раз, как предполагает принятый ответ.