Mostrar el teclado virtual de SearchView en ActionBar

Tenemos un SearchView en la ActionBar que está configurado para no ser iconificado. Como no tenemos ningún contenido en la vista hasta que el usuario ha introducido algo para buscar, tendría sentido darle el enfoque inicial de SearchView y asegurarse de que el teclado virtual esté listo para que el usuario ingrese texto, Siempre tendrá que tocar primero en el SearchView.

Puedo dar el enfoque de SearchView simplemente llamando

searchView.requestFocus(); 

Pero no puedo conseguir el teclado suave para que aparezca. En otro de nuestros fragmentos tengo un EditText que queremos ser enfocado Puedo conseguir el teclado suave para aparecer allí llamando

 InputMethodManager mgr = (InputMethodManager)getActivity().getSystemService( Context.INPUT_METHOD_SERVICE); mgr.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); 

Pero esto simplemente no funciona en el SearchView. Debe ser posible que esto funcione.

Más allá de rummaging alrededor de StackOverflow y encontré esta pregunta:

Forzar la apertura del teclado

Que contiene una solución que funcionó para mí:

 ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)). toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 

Estoy utilizando un SearchView con setIconifiedByDefault (false). Prueba con Android 4.4.2, la única manera que podría conseguir el teclado para mostrar realmente era mirar el código fuente para SearchView y imitar cómo pidió el teclado para mostrar. He intentado literalmente todos los otros métodos que podría encontrar / pensar y esta es la única manera que podría conseguir el teclado para mostrar de forma fiable. Lamentablemente, mi método requiere cierta reflexión.

En onCreateOptionsMenu (Menú):

 searchView.requestFocus(); searchView.post(new Runnable() { @Override public void run() { showSoftInputUnchecked(); } }); 

Y luego crear un método para llamar al método oculto "showSoftInputUnchecked" en 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 } } } } 

Al igual que con todas las soluciones que acceden a métodos que no están en la API pública, no puedo prometer que esto no romperá con las nuevas versiones de Android.

Trate de adjuntar onFocusChangeListener a su SearchView – que trabajó para mí con un 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); } } }); 

También asegúrese de que en el xml no hay etiqueta de enfoque de solicitud en el SearchView , de lo contrario su oyente no será llamado.

Funcionó para mí.

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

Utilice el método de expandView: Su onCreateOptionsMenu podría ser algo como esto:

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

Puedes probar lo que hice. Esto funcionó bien para mí.

  //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; } }); 
  • MultiChoiceMode antes de API 11
  • Cómo cambiar el color del texto de la barra de acción sherlock
  • Botón de inicio personalizado en ActionBar
  • Errores de Android SlidingMenu al hacer referencia a ABS
  • Excepción de puntero nulo mostrando en la barra de acción sherlock library
  • Cómo cambiar el botón de inicio (home) de searchview en la barra de acción de Sherlock?
  • Set contentDescription para el botón de ActionBar arriba
  • Errores de compilación usando ActionbarSherlock en android studio 0.3.1
  • Elementos de ActionBarSherlock que no aparecen en desbordamiento
  • Android Studio Pre Dexing falla
  • Acciones de ActionBar de desbordamiento que no se muestran en Menú para Android 2.x
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.