SearchView фокусируется при скрытии меню ActionBar - PullRequest
12 голосов
/ 30 сентября 2011

У меня есть ActionBar с SearchView.Пункты скрытого / переполненного меню отображаются справа в раскрывающемся списке при выборе кнопки меню.Когда раскрывающееся меню скрыто, SearchView фокусируется и отображается клавиатура.Есть ли способ остановить отображение клавиатуры (кроме случая, когда происходит касание SearchView)?

С уважением, Юлий.

Редактировать добавленный код ниже: Вот как я инициализирую его:

        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;
    }

Ответы [ 6 ]

31 голосов
/ 09 ноября 2011

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

7 голосов
/ 03 октября 2011

попробуйте вызвать setFocusable (false) в SearchView при его инициализации.

2 голосов
/ 23 июля 2014

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

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

@Override
public void onResume() {
    super.onResume();
    getView().post(new Runnable() {
        public void run() {
            if (mFilterView.isIconfiedByDefault()) {
                mFilterView.setIconifiedByDefault(false);
                mFilterView.clearFocus();
            }
        }
    });
}
1 голос
/ 22 мая 2014

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

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

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

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

1 голос
/ 05 ноября 2011

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

_resultsFragment.getView().requestFocus();
0 голосов
/ 10 июля 2013

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

android:focusable="false"

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...