Ich verwende derzeit einen ActionBar-Menüpunkt, um eine Suchansicht in der Aktionsleiste anzuzeigen. Wenn der Suchmenüpunkt erweitert wird, wird die Softtastatur angezeigt, die ich möchte. Wenn der Benutzer jetzt die Zurück-Taste drückt, um die Softtastatur zu schließen, möchte ich auch die Suchansicht in der Aktionsleiste reduzieren.
Ich habe versucht, die folgenden Listener OnKeyListener und OnFocusChangeListener auf dem MenuItem und der ActionView zu implementieren. Ich habe auch versucht, OnBackPressed () in der Aktivität zu verwenden. Keiner der oben genannten Punkte erkennt, wann die Zurück-Taste zum Schließen der Softtastatur verwendet wird.
Irgendwelche Ideen?
Ich habe OnActionExpandListener implementiert, um zu wissen, wann die Suchansicht sichtbar ist.
quelle
Antworten:
Ich werde die Antwort von @ user1258568 für die Faulen erweitern. 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); } } });
quelle
menu.getItem(yourSearchViewItemPosition)
stattdessen verwenden.setOnFocusChangeListener()
stattdessen verwendetsetOnQueryTextFocusChangeListener()
. Mit Ihrer Methode funktioniert alles gut. Vielen Dank.Ich habe eine bessere Lösung gefunden.
searchView.setOnQueryTextFocusChangeListener().
Das
OnQueryTextFocusChangeListener
wird aufgerufen, wenn die Tastatur angezeigt oder ausgeblendet wird. Wird zuerst aufgerufen, wenn die Tastatur angezeigt wird und die Suchansicht den Fokus hat.keyboard
Wird erneut aufgerufen, wenn es ausgeblendet ist und die Suchansicht den Fokus verliert, kannclose search view
dann verwendet werdenmenuItem.collapseActionView().
quelle
OnQueryTextFocusChangeListener
wird NICHT aufgerufen, wenn die Tastatur angezeigt oder ausgeblendet wird. Es wird nur aufgerufen, wenn dassearchView
scharfgestellt wird und / oder unscharf wird. Wenn also dasSearchView
zum ersten MalOnQueryTextFocusChangeListener
scharfgestellt ist , wird das aufgerufen und auch die Tastatur angezeigt. Wenn nun die Zurück-Taste gedrückt wird, wird die Tastatur ausgeblendet,OnQueryTextFocusChangeListener
aber nicht aufgerufen. Wenn Sie die Zurück-Taste ein zweites Mal drücken, wird dassearchView
Fenster ausgeblendet undOnQueryTextFocusChangeListener
aufgerufen.OnBackPressed einfach so überschreiben:
@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; }
Lassen Sie Ihre Klasse Folgendes wie folgt implementieren:
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 "mSearchView" und "isClosed" beide globalen Variablen für die Aktivität festlegen.
quelle
Die Antwort von Jon Willis funktioniert großartig. Dies ist eine Verbesserung seiner Antwort.
Erstellen Sie zunächst eine neue Klasse, die Folgendes implementiert
View.OnFocusChangeListener
: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); } } } }
Stellen Sie als Nächstes den Listener auf Folgendes ein
SearchView
:searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));
quelle
Sie müssen nur das Attribut "destroyActionView" 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" in der Suchansicht aufzurufen, um die Tastatur nach dem Senden der Abfrage zu schließen.
quelle
Dies ist, was ich getan habe, 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; } });
quelle
Es 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, funktionierten bei mir nicht, weil das Ereignis nicht gestartet wurde. Die Suchansicht verlor beim Senden 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 Textübermittlung genauer beschreibt.
quelle
@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); }
quelle
Wenn Sie die Tastatur reduzieren möchten, wenn der Benutzer auf das Suchsymbol auf der Tastatur klickt, kann dies einfach erreicht werden
inside onquerytextsubmitted {
searchView.clearfocus()
}
quelle
Sie müssen setIconified zweimal aufrufen.
Um Ihre Suchansicht tatsächlich zu reduzieren und die Tastatur zu schließen.
Beim ersten Anruf wird der Text der Suchansicht mit der zweiten Anruftastatur gelöscht und die Suchansicht geschlossen.
quelle
Aus irgendeinem Grund hat
menuItem.collapseActionView()
es nicht funktioniert, also habe ichsearchView.setIconified(true)
stattdessen 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); } } });
quelle