2013-03-05 15 views
11

Abbiamo una SearchView su ActionBar che è impostata per essere non-iconificata. Dato che non abbiamo alcun contenuto nella vista fino a quando l'utente non ha inserito qualcosa da cercare, avrebbe senso dare il focus iniziale di SearchView e assicurarsi che la tastiera software sia pronta per consentire all'utente di inserire il testo - altrimenti è " Dovrai sempre toccare prima il SearchView.Visualizzazione della tastiera virtuale per SearchView su ActionBar

posso dare il focus SearchView semplicemente chiamando

searchView.requestFocus(); 

ma non riesco a ottenere che venga visualizzata la tastiera virtuale. In un altro dei nostri frammenti ho un EditText cui vogliamo essere concentrati I posso portare la tastiera morbida ad apparire lì chiamando

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

ma questo semplicemente non funziona sul SearchView. Deve essere sicuramente possibile farlo funzionare.

+0

Prova ora: http://stackoverflow.com/a/39635722/2535875 –

risposta

22

Ulteriori rovistare StackOverflow e ho trovato questa domanda:

Forcing the Soft Keyboard open

quali contiene una soluzione che ha funzionato per me:

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

Questo mi dà la tastiera, ma se lo facevo all'interno di onCreateOptionsMenu(), dovevo tenere un flag per assicurarmi di aver eseguito questo codice una sola volta. Altrimenti la tastiera continuerà a comparire nuovamente dopo aver inviato una ricerca. – user291701

+1

Ho avuto lo stesso problema e ho trovato la soluzione SearchView qui utile: http://stackoverflow.com/questions/12022715/unable-to-show-keyboard-automatically-in-the-searchview –

+1

Questo è inutile, cosa succede se hai 2 viste che possono consentire l'input da tastiera? Hai bisogno di più per ottenere la tastiera per inviare il testo alla vista corretta. – mskw

1

tenta di collegare al vostro onFocusChangeListenerSearchView - ha funzionato per me 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); 
      } 
     } 
    }); 

fare in modo che nel file XML non v'è alcuna richiesta di tag focus sul SearchView Inoltre, in caso contrario il vostro ascoltatore non lo farà essere chiamato.

+0

questo non funziona neanche. Come ho detto nella domanda, posso far visualizzare la tastiera virtuale su un frammento diverso in cui abbiamo un EditText, che suggerisce che c'è qualcosa di "speciale" nel fatto che si tratti di un SearchView, o "speciale" in quanto si trova in ActionBar. –

-1

Uso ExpandView metodo: tuo onCreateOptionsMenu potrebbe essere qualcosa di simile:

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

Puoi provare quello che ho fatto. Questo ha funzionato bene per me.

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

    }); 
6

Sto usando un SearchView con setIconifiedByDefault (false). Provando con Android 4.4.2, l'unico modo in cui avrei potuto mostrare la tastiera era guardare il codice sorgente di SearchView e simulare come richiedeva la visualizzazione della tastiera. Ho provato letteralmente ogni altro metodo che potrei trovare/pensare e questo è l'unico modo in cui è possibile ottenere la tastiera in modo affidabile. Sfortunatamente, il mio metodo richiede qualche riflessione.

In onCreateOptionsMenu (Menu):

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

E poi creare un metodo per chiamare il metodo nascosto "showSoftInputUnchecked" in 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 
      } 
     } 
    } 
} 

Come per tutte le soluzioni che non accedono metodi in API pubblica, non posso promettere che questo non si romperà con le nuove versioni di Android.

+0

GRAZIE! Funziona! –

+0

L'unica risposta che funziona. Quanto è triste la situazione della tastiera virtuale su Android? È patetico. –

0

Ha funzionato per me.

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

Ho un problema simile in cui nessuna delle soluzioni proposte ha funzionato. Alcuni semplicemente non hanno fatto apparire la tastiera e alcuni mostrano una tastiera, ma il tasto premuto non funziona.

L'unica cosa che ha funzionato è stato:

    // hack for making the keyboard appear 
        searchView.setIconified(true); 
        searchView.setIconified(false); 
Problemi correlati