wake-up-neo.com

Wie kann ich die Tastatur in Android SearchView verwerfen?

Ich habe eine Suchansicht in der Aktionsleiste. Ich möchte die Tastatur schließen, wenn der Benutzer mit der Eingabe fertig ist. Ich habe den folgenden queryTextListener im 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; 
    } 
};

Aufgrund ähnlicher Fragen sollte der folgende Code die Tastatur verwerfen, aber in diesem Fall funktioniert sie nicht:

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

Ich habe auch versucht:

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

Keiner arbeitet. Ich bin nicht sicher, ob es sich um ein Honeycomb-spezifisches Problem handelt oder ob es sich um das searchView in der Aktionsleiste oder um beides handelt. Hat jemand das zum Laufen gebracht oder weiß, warum es nicht funktioniert?

51
CACuzcatlan

Ich habe versucht, etwas Ähnliches zu tun. Ich musste die SearchActivity von einer anderen Activity starten und den Suchbegriff beim Laden im geöffneten Suchfeld anzeigen lassen. Ich habe alle oben genannten Ansätze ausprobiert, aber zum Schluss (ähnlich wie die Antwort von Ridcully oben ) habe ich eine Variable auf SearchView in onCreateOptionsMenu() gesetzt und dann in onQueryTextSubmit() die clearFocus() der SearchView aufgerufen, als der Benutzer eine neue Suche übermittelte:

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

Einfach, direkt zur Sache und sauber:

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

geben Sie einfach onQueryTextSubmit wie unten zurück

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

Irgendwie funktioniert es, wenn du anrufst

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

und dann 

otherWidget.requestFocus();
10

Für mich arbeitete nichts davon beim ersten Senden. Es versteckte sich und zeigte sofort wieder die Tastatur. Ich musste clearFocus() auf dem Handler der View posten, um dies zu ermöglichen, nachdem alles andere erledigt war.

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

Für mich funktioniert folgendes:

In meiner Aktivität habe ich eine Membervariable

private SearchView mSearchView;

In onCreateOptionsMenu() setze ich diese Variable so:

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

In der QueryTextListener mache ich schließlich Folgendes:

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

Ich habe mir den Quellcode von SearchView angeschaut, und wenn Sie den Abfragetext nicht auf eine leere Zeichenfolge zurücksetzen, macht SearchView dies einfach und entfernt die Tastatur auch nicht. Eigentlich, wenn man im Quellcode tief genug drillt, kommt es auf dasselbe an, schlug Yuku vor, aber ich mag meine Lösung besser, da ich mich nicht mit diesen einfachen Dingen herumschlagen muss. 

7
Ridcully

Edit: Ich fügte die bessere Lösung hinzu, behielt aber die alte Antwort als Referenz bei. 

 @Override
        public boolean onQueryTextSubmit(String query) {

                  searchView.clearFocus();
            return false;
        }

Ursprüngliche Antwort: Ich habe mit einem setOnQueryTextListener programmiert. Wenn die Suchansicht ausgeblendet ist, wird die Tastatur ausgeblendet. Wenn sie wieder sichtbar ist, wird die Tastatur nicht wieder angezeigt.

    //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 einer Tablet-App, an der ich mit einer Doppelfenster-Aktivität arbeite, habe ich nur geschrieben

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

und das war genug, um die Soft-Tastatur nach einer Suche zu schließen. InputMethodManager muss nicht verwendet werden

1
Jose_GD

Ich habe ActionBarSherlock 4.3 verwendet und habe einen ProgressDialog. Wenn ich es in der postExecute-Methode verwerfe, gewinnt Searchview den Fokus. Um das zu beheben:

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

Ich hoffe es hilft.

1

Du kannst es benutzen.

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

Unter dem folgenden Code kann ich die Tastatur in Searchview ausblenden

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

Warum probierst du das nicht? Wenn Sie auf die X-Schaltfläche tippen, wird der Fokus auf die Suchansicht gesetzt, egal was passiert. 

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

Zwei Lösungen, die für mich funktionierten, die erste, die die SearchView-Instanz verwendet:

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

Zweite Lösung:

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