Obecnie używam elementu menu ActionBar, aby wyświetlić widok wyszukiwania na pasku akcji. Gdy pozycja menu wyszukiwania jest rozszerzona, wyświetlana jest klawiatura programowa, której chcę. Teraz, gdy użytkownik naciśnie przycisk Wstecz, aby zamknąć klawiaturę programową, chciałbym również zwinąć widok wyszukiwania na pasku akcji.
Próbowałem zaimplementować następujące odbiorniki OnKeyListener i OnFocusChangeListener w MenuItem i ActionView. Próbowałem również użyć OnBackPressed () w działaniu. Żadne z powyższych nie wykrywa, kiedy przycisk Wstecz jest używany do zamykania klawiatury programowej.
Jakieś pomysły?
Zaimplementowałem OnActionExpandListener, aby wiedzieć, kiedy SearchView jest widoczny.
android
android-actionbar
android-softkeyboard
user1258568
źródło
źródło
Odpowiedzi:
Rozszerzę odpowiedź @ user1258568 dla leniwych. To zadziałało dla mnie. Zauważ, że czyści zapytanie, gdy utraci się fokus.
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); } } });
źródło
menu.getItem(yourSearchViewItemPosition)
zamiast tego.setOnFocusChangeListener()
zamiast tego użyłemsetOnQueryTextFocusChangeListener()
. Z twoją metodą wszystko działa dobrze. Dziękuję Ci.Znalazłem lepsze rozwiązanie.
searchView.setOnQueryTextFocusChangeListener().
Jest
OnQueryTextFocusChangeListener
wywoływana, gdy klawiatura jest wyświetlana lub ukryta. Jest wywoływana jako pierwsza, gdy klawiatura jest wyświetlana, a widok wyszukiwania będzie miał fokus. Jest wywoływany ponownie, gdykeyboard
jest ukryty, a widok wyszukiwania straci fokus, możeclose search view
następnie użyćmenuItem.collapseActionView().
źródło
OnQueryTextFocusChangeListener
Nie uzyskać wywołana, gdy klawiatura jest wyświetlana lub ukryte. Jest wywoływany tylko wtedy, gdysearchView
jest ostry i / lub nieostry. Tak więc, gdySearchView
fokus jest pierwszy raz,OnQueryTextFocusChangeListener
wywoływany jest element i wyświetlana jest również klawiatura. Teraz, jeśli przycisk Wstecz zostanie naciśnięty, klawiatura zostanie ukryta, aleOnQueryTextFocusChangeListener
nie zostanie wywołana. Po ponownym naciśnięciu przycisku Wstecz przycisksearchView
zwija się iOnQueryTextFocusChangeListener
jest wywoływany.Just Override onBackPressed w ten sposób:
@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(); } }
a twoje onCreateOptionsMenu zwiększyłoby mSearchView w następujący sposób:
@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; }
czy masz klasę zaimplementuj następujące w ten sposób:
public class myActivity extends FragmentActivity implements SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener {
które będziesz również potrzebować:
@Override public void onClick(View view) { isClosed = false; } @Override public boolean onClose() { isClosed = true; return false; }
Będziesz musiał ustawić „mSearchView” i „isClosed” jako obie zmienne globalne dla działania.
źródło
Odpowiedź Jona Willisa działa świetnie. To ulepszenie jego odpowiedzi.
Najpierw utwórz nową klasę, która implementuje
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); } } } }
Następnie ustaw odbiornik na
SearchView
:searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));
źródło
Wystarczy umieścić atrybut „collapseActionView” w układzie menu
<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>
To da ci funkcjonalność, której szukasz. Nie zapomnij wywołać metody „clearFocus” w SearchView, aby zamknąć klawiaturę po wysłaniu zapytania.
źródło
To właśnie zrobiłem, aby klawiatura zniknęła. Możesz spróbować sprawdzić, czy to działa dla Ciebie. Ustawiłem jako
searchView
niewidoczne, a następnie ponownie widoczne.//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; } });
źródło
Jest to osiągalne w następujący sposób:
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; } }); }
Rozwiązania oparte na setOnQueryTextFocusChangeListener () nie działały u mnie, ponieważ zdarzenie nie zostało uruchomione - searchView nie stracił fokusu po przesłaniu, prawdopodobnie dlatego, że wykonuję wyszukiwanie w tym samym działaniu, które zawiera widok wyszukiwania.
W każdym razie uważam, że użycie OnQueryTextListener jest bardziej poprawne, ponieważ dokładniej opisuje zdarzenie złożenia tekstu.
źródło
@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); }
źródło
Jeśli chcesz zwinąć klawiaturę, gdy użytkownik kliknie ikonę wyszukiwania na klawiaturze, można to zrobić w prosty sposób
inside onquerytextsubmitted {
searchView.clearfocus()
}
źródło
Musisz dwukrotnie wywołać setIconified.
Aby faktycznie zwinąć widok wyszukiwania i zamknąć klawiaturę.
Przy pierwszym wywołaniu tekst widoku wyszukiwania jest czyszczony za pomocą klawiatury drugiego połączenia, a widok wyszukiwania zostaje zamknięty.
źródło
Z jakiegoś powodu
menuItem.collapseActionView()
nie zadziałało, więc skorzystałemsearchView.setIconified(true)
zamiast tego .Daje to poniższy wynik jako przykład kodu.
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); } } });
źródło