Ich verwende derzeit ein ActionBar-Menüelement, um eine SearchView in der Aktionsleiste anzuzeigen. Wenn der Suchmenüpunkt erweitert wird, wird die Soft-Tastatur angezeigt, was ich möchte. Wenn der Benutzer jetzt die Zurück-Taste drückt, um die Bildschirmtastatur zu schließen, möchte ich auch die Suchansicht in der Aktionsleiste ausblenden.
Ich habe versucht, die folgenden Listener OnKeyListener und OnFocusChangeListener im MenuItem und im ActionView zu implementieren. Ich habe auch versucht, OnBackPressed () in der Aktivität zu verwenden. Keine der oben genannten Funktionen erkennt, wann die Zurück-Taste zum Schließen der Soft-Tastatur verwendet wird.
Irgendwelche Ideen?
Ich habe OnActionExpandListener implementiert, um zu wissen, wann der SearchView sichtbar ist.
Ich werde auf die Antwort von @ user1258568 für die Faulen eingehen. Das hat bei mir funktioniert. Beachten Sie, dass Ihre Abfrage gelöscht wird, wenn der Fokus verloren geht.
final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search);
final SearchView searchView = (SearchView) searchMenuItem.getActionView();
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean queryTextFocused) {
if(!queryTextFocused) {
searchMenuItem.collapseActionView();
searchView.setQuery("", false);
}
}
});
Ich habe eine bessere Lösung gefunden.
searchView.setOnQueryTextFocusChangeListener().
Das OnQueryTextFocusChangeListener
wird aufgerufen, wenn die Tastatur ein- oder ausgeblendet wird. Wird zuerst aufgerufen, wenn die Tastatur angezeigt wird und die Suchansicht den Fokus hat. Wird erneut aufgerufen, wenn keyboard
ausgeblendet ist und die Suchansicht den Fokus verliert. Kann close search view
dann mit
menuItem.collapseActionView().
Überschreibe einfach onBackPressed wie folgt:
@Override
public void onBackPressed() {
if (searchView.isShown()){
searchView.onActionViewCollapsed(); //collapse your ActionView
searchView.setQuery("",false); //clears your query without submit
isClosed = true; //needed to handle closed by back
} else{
super.onBackPressed();
}
}
und Ihr onCreateOptionsMenu würde die mSearchView folgendermaßen aufblasen:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu_search, menu);
mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView();
mSearchView.setOnQueryTextListener(this);
mSearchView.setOnSearchClickListener(this);
mSearchView.setOnCloseListener(this);
isClosed = true;
return true;
}
haben Sie Klasse Folgendes implementiert:
public class myActivity extends FragmentActivity implements
SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener {
was du auch brauchst:
@Override
public void onClick(View view) {
isClosed = false;
}
@Override
public boolean onClose() {
isClosed = true;
return false;
}
Sie müssen die beiden globalen Variablen "mSearchView" und "isClosed" für die Aktivität festlegen.
Sie müssen nur das Attribut "collapseActionView" in das Menülayout einfügen
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/menu_item_search"
Android:title="@string/search"
Android:iconifiedByDefault="true"
Android:icon="@drawable/ic_action_search"
app:actionViewClass="Android.support.v7.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView"/> <--this one
</menu>
Dadurch erhalten Sie die Funktionalität, nach der Sie selbst suchen. Vergessen Sie nicht, die Methode "clearFocus" im SearchView aufzurufen, um die Tastatur zu schließen, sobald Sie die Abfrage gesendet haben.
Die Antwort von Jon Willis funktioniert hervorragend. Dies ist eine Verbesserung seiner Antwort.
Erstellen Sie zunächst eine neue Klasse, die View.OnFocusChangeListener
Implementiert:
public class SearchViewFocusListener implements View.OnFocusChangeListener {
private final MenuItem mMenuItem;
public SearchViewFocusListener(MenuItem menuItem) {
mMenuItem = menuItem;
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
mMenuItem.collapseActionView();
if (v instanceof SearchView) {
((SearchView) v).setQuery("", false);
}
}
}
}
Als nächstes setzen Sie den Listener auf Ihr SearchView
:
searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));
Das ist so erreichbar:
private void setupSearchView(Menu menu) {
final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) searchMenuItem.getActionView();
[...]
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
searchMenuItem.collapseActionView();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return true;
}
});
}
Lösungen, die auf setOnQueryTextFocusChangeListener () basieren, haben bei mir nicht funktioniert, da das Ereignis nicht gestartet wurde. Die searchView verlor bei der Übermittlung nicht den Fokus, wahrscheinlich, weil ich die Suche in derselben Aktivität durchführe, die die Suchansicht enthält.
Ich denke jedenfalls, dass die Verwendung von OnQueryTextListener korrekter ist, da es das Ereignis der Übermittlung von Text genauer beschreibt.
Das habe ich getan, um die Tastatur verschwinden zu lassen. Sie können versuchen zu sehen, ob dies für Sie funktioniert. Ich setze das searchView
auf unsichtbar und dann wieder auf sichtbar.
//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;
}
});
Wenn Sie die Tastatur reduzieren möchten, wenn der Benutzer auf das Suchsymbol auf der Tastatur klickt, können Sie dies auf einfache Weise erreichen
inside onquerytextsubmitted {
searchView.clearfocus()
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.home_screen, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
final SearchView searchView = (SearchView) searchMenuItem
.getActionView();
searchView.setIconifiedByDefault(false);
if (searchManager != null && searchView != null) {
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView
.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
if (searchMenuItem != null) {
searchMenuItem.collapseActionView();
}// end if
if (searchView != null) {
searchView.setQuery("", false);
}// end if
}// end if
}
});
searchView
.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
/**
* hides and then unhides search tab to make sure
* keyboard disappears when query is submitted
*/
if (searchView != null) {
searchView.setVisibility(View.INVISIBLE);
searchView.setVisibility(View.VISIBLE);
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
// TODO Auto-generated method stub
return false;
}
});
}
return super.onCreateOptionsMenu(menu);
}
Aus irgendeinem Grund hat menuItem.collapseActionView()
nicht funktioniert, daher habe ich stattdessen searchView.setIconified(true)
verwendet.
Dies ergibt das folgende Ergebnis als Codebeispiel.
final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
searchView.setIconified(true);
}
}
});
Sie müssen setIconified zweimal aufrufen.
So reduzieren Sie die Suchansicht und schließen die Tastatur.
Beim ersten Anruf wird der Text der Suchansicht mit der Zweitanruftastatur gelöscht und die Suchansicht geschlossen.