Как я могу получить onBackPressed (), в то время как SearchView активирован?

Как я могу обрабатывать onBackPressed() в режиме поиска? Я выполнил поиск в ActionBar , и я хочу обработать onBackPressed() .

Редактировать:

В MainActivity я добавил это, но он только получает уведомление, когда поиск закрыт

 @Override public void onBackPressed() { mMenu.findItem(R.id.menu_eye).setVisible(true); mMenu.findItem(R.id.menu_layers).setVisible(true); super.onBackPressed(); }; 

И мой слушатель для действия поиска выглядит так:

 import com.cyrilmottier.polaris.PolarisMapView; import android.app.SearchManager.OnCancelListener; import android.content.Context; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.SearchView; public class SearchListener implements SearchView.OnQueryTextListener, SearchView.OnCloseListener, SearchView.OnSuggestionListener, OnClickListener, OnCancelListener{ private Context mContext; private PolarisMapView mMapView; private Menu mMenu; private SearchView mSearchView; public SearchListener(Context c, PolarisMapView mMapView, Menu mMenu, SearchView mSearchView){ this.setmContext(c); this.setmMapView(mMapView); this.setmMenu(mMenu); this.mSearchView = mSearchView; } @Override public boolean onQueryTextChange(String newText) { return false; } @Override public boolean onQueryTextSubmit(String query) { if (Constants.searchPlaceNavigate(query, mContext, mMapView)) return this.onClose(); return false; } public Context getmContext() { return mContext; } public void setmContext(Context mContext) { this.mContext = mContext; } public PolarisMapView getmMapView() { return mMapView; } public void setmMapView(PolarisMapView mMapView) { this.mMapView = mMapView; } @Override public boolean onSuggestionClick(int position) { String p = mSearchView.getSuggestionsAdapter().getCursor().getString(position); if(position== 0) p = mSearchView.getSuggestionsAdapter().getCursor().getString(position*4+1); if(p != null) if(position== 0) Constants.searchPlaceNavigate(mSearchView.getSuggestionsAdapter().getCursor().getString(position*4+1), mContext, mMapView); else Constants.searchPlaceNavigate(mSearchView.getSuggestionsAdapter().getCursor().getString(position), mContext, mMapView); return this.onClose(); } @Override public boolean onSuggestionSelect(int position) { return false; } @Override public boolean onClose() { mMenu.findItem(R.id.menu_eye).setVisible(true); mMenu.findItem(R.id.menu_layers).setVisible(true); mMenu.findItem(R.id.menu_search).collapseActionView(); return true; } public Menu getmMenu() { return mMenu; } public void setmMenu(Menu mMenu) { this.mMenu = mMenu; } public SearchView getmSearchView() { return mSearchView; } public void setmSearchView(SearchView mSearchView) { this.mSearchView = mSearchView; } @Override public void onClick(View v) { this.onClose(); } @Override public void onCancel() { this.onClose(); } } 

Другим способом является прослушивание MenuItem для ActionExpand / Collapse:

  MenuItem searchMenuItem = menu.findItem(R.id.menu_search); searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { // Do whatever you need return true; // KEEP IT TO TRUE OR IT DOESN'T OPEN !! } @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do whatever you need return true; // OR FALSE IF YOU DIDN'T WANT IT TO CLOSE! } }); SearchView searchView = (SearchView) searchMenuItem.getActionView(); ... // Keep doing as you do 

Я думаю, что этот способ чище, поскольку вы слушаете прямо на том, что хотите

Благодаря этой теме

Для поддержки устаревших устройств можно использовать следующий код:

  MenuItemCompat.setOnActionExpandListener(searchItem,new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { //Do whatever you want return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { //Do whatever you want return true; } }); 

Вы можете расширить SearchView и переопределить dispatchKeyEventPreIme:


     Открытый класс CustomSearchView расширяет SearchView {
         Public CustomSearchView (конечный контекст контекста) {
             супер (контекст);
             this.setIconifiedByDefault (истина);
         }

         @Override
         Public boolean dispatchKeyEventPreIme (событие KeyEvent) {
             If (event.getKeyCode () == KeyEvent.KEYCODE_BACK && 
                 Event.getAction () == KeyEvent.ACTION_UP) {
                 this.onActionViewCollapsed ();
             }
             Return super.dispatchKeyEventPreIme (событие);
         }
     }

Вы всегда можете расширить любые виды и переопределить методы прослушивания следующим образом:

 class MySearchView extends SearchView { @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); //don't forget call this } } 

Я нашел ответ, ключом к нему были предыдущие ответы от г-на Али Имрана и из нового мира, я должен переопределить этот метод:

 @Override public void onActionViewCollapsed() { //do somethink super.onActionViewCollapsed(); } 

Он вызывается каждый раз, когда searchView закрывается, поэтому он может обращаться с корпусом подставки.

Тот же ответ, что и создание пользовательского вида поиска, но со слушателем

 public class SearchViewer extends SearchView { private OnBackPressListener onBackPressListener; private boolean isKeyboardVisible; public SearchViewer(Context context) { super(context); } public SearchViewer(Context context, AttributeSet attrs) { super(context, attrs); } public SearchViewer(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void init() { KeyboardUtils.addKeyboardToggleListener((Activity) getContext(), new KeyboardUtils.SoftKeyboardToggleListener() { @Override public void onToggleSoftKeyboard(boolean isVisible) { SearchViewer.this.isKeyboardVisible = isVisible; } }); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); init(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); KeyboardUtils.removeAllKeyboardToggleListeners(); } @Override public boolean dispatchKeyEventPreIme(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { if (onBackPressListener != null && !isKeyboardVisible) onBackPressListener.backPress(); } return super.dispatchKeyEventPreIme(event); } public OnBackPressListener getOnBackPressListener() { return onBackPressListener; } public void setOnBackPressListener(OnBackPressListener onBackPressListener) { this.onBackPressListener = onBackPressListener; } public interface OnBackPressListener { void backPress(); } } 

Класс Util для видимости клавиатуры, поэтому, если клавиатура видна назад, нажмите, чтобы скрыть ее, не закрывая активность

 public class KeyboardUtils implements ViewTreeObserver.OnGlobalLayoutListener { private static HashMap<SoftKeyboardToggleListener, KeyboardUtils> sListenerMap = new HashMap<>(); private SoftKeyboardToggleListener mCallback; private View mRootView; private float mScreenDensity = 1; private KeyboardUtils(Activity act, SoftKeyboardToggleListener listener) { mCallback = listener; mRootView = ((ViewGroup) act.findViewById(android.R.id.content)).getChildAt(0); mRootView.getViewTreeObserver().addOnGlobalLayoutListener(this); mScreenDensity = act.getResources().getDisplayMetrics().density; } public static void addKeyboardToggleListener(Activity act, SoftKeyboardToggleListener listener) { removeKeyboardToggleListener(listener); sListenerMap.put(listener, new KeyboardUtils(act, listener)); } public static void removeKeyboardToggleListener(SoftKeyboardToggleListener listener) { if (sListenerMap.containsKey(listener)) { KeyboardUtils k = sListenerMap.get(listener); k.removeListener(); sListenerMap.remove(listener); } } public static void removeAllKeyboardToggleListeners() { for (SoftKeyboardToggleListener l : sListenerMap.keySet()) sListenerMap.get(l).removeListener(); sListenerMap.clear(); } @Override public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. mRootView.getWindowVisibleDisplayFrame(r); int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top); float dp = heightDiff / mScreenDensity; if (mCallback != null) mCallback.onToggleSoftKeyboard(dp > 200); } private void removeListener() { mCallback = null; mRootView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } public interface SoftKeyboardToggleListener { void onToggleSoftKeyboard(boolean isVisible); } } 

образец кода:

 searchView.setOnBackPressListener(new SearchViewer.OnBackPressListener() { @Override public void backPress() { onBackPressed(); } }); 

Переопределение этого метода может помочь вам

  @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub return super.onKeyDown(keyCode, event); }