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

Отображение мягкой клавиатуры для 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. Это, безусловно, возможно, чтобы заставить это работать.

4b9b3361

Ответ 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;
        }

     });