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?
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;
}
Einfach, direkt zur Sache und sauber:
@Override
public boolean onQueryTextSubmit(String query) {
// your search methods
searchView.clearFocus();
return true;
}
geben Sie einfach onQueryTextSubmit wie unten zurück
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
Irgendwie funktioniert es, wenn du anrufst
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
und dann
otherWidget.requestFocus();
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;
}
});
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.
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;
}
});
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
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.
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;
}
}
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;
}
});
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);
}