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

Невозможно отобразить клавиатуру автоматически в SearchView

SearchView ориентирован по умолчанию, но когда я пытаюсь показать программную клавиатуру - этого не происходит:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

Но когда я нажимаю на SearchView - он делает. Почему?

4b9b3361

Ответ 1

Фиксированный!

mSearchView.setOnQueryTextFocusChangeListener(new OnFocusChangeListener() {
                        @Override
                        public void onFocusChange(View view, boolean hasFocus) {
                            if (hasFocus) {
                                showInputMethod(view.findFocus());
                            }
                        }
                    });

и

private void showInputMethod(View view) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
          imm.showSoftInput(view, 0);
        }
    }

Ответ 2

Я столкнулся с этой проблемой с SearchView, который все еще не открыл клавиатуру, и смог сделать это, добавив задержку в 200 мкс:

   mSearchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(final View view, boolean hasFocus) {
            if (hasFocus) {
                view.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.showSoftInput(view.findFocus(), 0);
                    }
                }, 200);
            }
        }
    });

Ответ 3

Как насчет использования setOnFocusChangeListener?

searchview.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus){
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
        }
    }
});

Ответ 4

Если вы используете SearchView:

<android.support.v7.widget.SearchView
      android:id="@+id/searchView"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:focusableInTouchMode="true"
      android:iconifiedByDefault="true"
      app:showAsAction="always"
      app:iconifiedByDefault="true"/>

Затем просто добавьте его в свой метод onCreate:

final SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
        searchView.setFocusable(true);
        searchView.setIconified(false);
        searchView.requestFocusFromTouch();

Это работает для меня.

Ответ 6

Я решил эту проблему следующим простым способом.

Пункт меню SearchView:

<item
    android:id="@+id/menu_item_search"
    android:icon="@drawable/ic_search"
    android:title="@android:string/search_go"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView" />

Чтобы развернуть SearchView и показать клавиатуру программным способом:

mMenuItemSearch.expandActionView();
mSearchView.setQuery("your default query test or null", true);

Протестировано с различными флажками showAsAction. Как результат, клавиатура не отображается, когда флаг: " всегда". Однако все работает с флагом: " всегда | collapseActionView"

expandActionView() + setQuery ( "null или восстановленный текст", true); можно вызвать, когда представление создано (или восстановлено), чтобы отобразить клавиатуру и сфокусироваться на поиске. P.S: вызов mSearchView.clearFocus(); после этого двух методов очистки фокуса.