it-swarm.it

Come ignorare la tastiera in SearchView Android?

Ho una searchView in ActionBar. Voglio chiudere la tastiera quando l'utente ha finito con l'input. Ho il seguente queryTextListener sul searchView

final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
    @Override 
    public boolean onQueryTextChange(String newText) { 
        // Do something 
        return true; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) {

        showProgress();
        // Do stuff, make async call

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        return true; 
    } 
};

In base a domande simili, il seguente codice dovrebbe ignorare la tastiera, ma in questo caso non funziona:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Ho anche provato:

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);

Nessuno dei due funziona. Non sono sicuro se si tratta di un problema specifico di Honeycomb o se è correlato al searchView in ActionBar o entrambi. Qualcuno ha funzionato o sa perché non funziona?

51
CACuzcatlan

Stavo cercando di fare qualcosa di simile. Avevo bisogno di lanciare SearchActivity da un'altra Activity e far apparire il termine di ricerca nel campo di ricerca aperto quando è stato caricato. Ho provato tutti gli approcci sopra ma alla fine (simile a la risposta di Ridcully sopra ) ho impostato una variabile su SearchView in onCreateOptionsMenu() e poi in onQueryTextSubmit() chiamata clearFocus() sulla SearchView quando l'utente ha inviato una nuova ricerca:

private SearchView searchView;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.search_menu, menu);
    searchView = (SearchView) menu.findItem(R.id.menu_search)
            .getActionView(); // set the reference to the searchView
    searchView.setOnQueryTextListener(this); 
    searchMenuItem = (MenuItem) menu.findItem(R.id.menu_search); 
    searchMenuItem.expandActionView(); // expand the search action item automatically
    searchView.setQuery("<put your search term here>", false); // fill in the search term by default
    searchView.clearFocus(); // close the keyboard on load
    return true;
}

@Override
public boolean onQueryTextSubmit(String query) {
    performNewSearch(query);
    searchView.clearFocus();
    return true;
}
64
bkurzius

Semplice, dritto al punto e pulito:

  @Override
  public boolean onQueryTextSubmit(String query) {
      // your search methods
      searchView.clearFocus();
      return true;
  }
31
dazito

basta restituire false su onQueryTextSubmit come di seguito

@Override
public boolean onQueryTextSubmit(String s) {
     return false;
}
18
Plugie

In qualche modo funziona se chiami

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);

e poi 

otherWidget.requestFocus();
10

Per me, nessuno dei precedenti stava lavorando al primo invio. Si stava nascondendo e quindi immediatamente mostrava la tastiera. Ho dovuto postare clearFocus() sul gestore della vista per farlo accadere dopo che è stato fatto con tutto il resto.

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                if (!"".equals(query)) {
                    mSearchView.post(new Runnable() {
                        @Override
                        public void run() {
                            mSearchView.clearFocus();
                        }
                    });
                }
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
7
Till

Per me, i seguenti lavori:

Nella mia attività ho una variabile membro

private SearchView mSearchView;

In onCreateOptionsMenu() imposto la variabile in questo modo:

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.library, menu);
    mSearchView = (SearchView)menu.findItem(R.id.miSearch).getActionView();
    mSearchView.setOnQueryTextListener(this);
    return true;
}   

Alla fine QueryTextListener, lo faccio:

mSearchView.setQuery("", false);
mSearchView.setIconified(true); 

Ho dato un'occhiata al codice sorgente di SearchView e, se non resetti il ​​testo della query a una stringa vuota, SearchView lo fa e non rimuove neanche la tastiera. In realtà, scavando abbastanza in profondità nel codice sorgente, arriva lo stesso, suggerì yuku, ma la soluzione mi piace ancora di più, dato che non devo scherzare con quelle cose di basso livello. 

7
Ridcully

Modifica: ho aggiunto la soluzione migliore, ma ho anche mantenuto la vecchia risposta come riferimento. 

 @Override
        public boolean onQueryTextSubmit(String query) {

                  searchView.clearFocus();
            return false;
        }

Risposta originale: ho programmato utilizzando un setOnQueryTextListener. Quando la vista di ricerca è nascosta, la tastiera si spegne e quando è nuovamente visibile, la tastiera non si riavvia.

    //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
             */
                  searchView.setVisibility(View.INVISIBLE);
                  searchView.setVisibility(View.VISIBLE);
            return false;
        }

     });
2
Parnit

In un'app per tablet con cui sto lavorando con un'attività dual panel, ho solo scritto

f.getView().requestFocus(); // f is the target fragment for the search

e questo è stato sufficiente per chiudere la tastiera morbida dopo una ricerca. Non è necessario utilizzare InputMethodManager

1
Jose_GD

Ho usato ActionBarSherlock 4.3 e ho un ProgressDialog. Quando lo ignoro nel metodo postExecute, Searchview si concentra. Per risolvere questo:

//Handle intent and hide soft keyboard
    @Override
    protected void onNewIntent(Intent intent) {
        setIntent(intent);
        handleIntent(intent);
        searchView.setQuery("", false);
        searchView.setIconified(true);
        searchView.clearFocus();
    }

    /*When dismiss ProgressDialog, searchview gain focus again and shows the keyboard. I  call clearFocus() to avoid it.*/

    AsyncTask.onPostExecute(){
      if(pd!=null)
        pd.dismiss();
      if(searchView!=null)
        searchView.clearFocus();
    }

Spero che sia d'aiuto.

1

Puoi usarlo.

if (isKeybordShowing(MainActivity.this, MainActivity.this.getCurrentFocus())) {
    onBackPressed();
}

public boolean isKeybordShowing(Context context, View view) {
    try {
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
        return keyboard.isActive();
    } catch (Exception ex) {
        Log.e("keyboardHide", "cannot hide keyboard", ex);
        return false;
    }
}
1
Mert TUTSAK

Sotto il codice sta lavorando per me per nascondere la tastiera in Searchview

MenuItem searchItem = baseMenu.findItem(R.id.menuSearch);

edtSearch= (EditText) searchItem.getActionView().findViewById(R.id.search_src_text);

MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
                        @Override
                        public boolean onMenuItemActionExpand(MenuItem item) {
                            edtSearch.post(new Runnable() {
                                @Override
                                public void run() {
                                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                                    imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
                                }
                            });
                            return true;
                        }

                        @Override
                        public boolean onMenuItemActionCollapse(MenuItem item) {
                            return true;
                        }
                    });
0
Ankita Shah

Perché non provi questo? Quando tocchi il pulsante X, attiverai un focus sulla searchview, a prescindere da cosa. 

ImageView closeButton = (ImageView)searchView.findViewById(R.id.search_close_btn);
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText et = (EditText) findViewById(R.id.search_src_text);
                et.setText("");`enter code here`
                searchView.setQuery("", false);
                searchView.onActionViewCollapsed();
                menuSearch.collapseActionView();
            }
        });

Due soluzioni che hanno funzionato per me, la prima utilizzando l'istanza SearchView:

private void hideKeyboard(){
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
}

Seconda soluzione:

private void hideKeyboard(){
            InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
 }
0
Elenasys