¿Cómo puedo obtener OnBackPressed () mientras SearchView está activado?

¿Cómo puedo manejar onBackPressed() en el modo de búsqueda? He implementado la búsqueda en el ActionBar , y quiero manejar onBackPressed() .

Editar:

En MainActivity he añadido esto, pero sólo se notifica cuando la búsqueda se cierra

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

Y mi oyente para la acción de búsqueda se parece a esto:

 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(); } } 

Otra manera es escuchar en el MenuItem para el 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 

Pienso que esta manera es más limpia, como usted escucha directamente en lo que usted quiere

Gracias a este hilo

Para el soporte de dispositivos antiguos, se puede utilizar el siguiente código:

  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; } }); 

Puede ampliar SearchView y reemplazar dispatchKeyEventPreIme:


     Public class CustomSearchView extiende SearchView {
         Public CustomSearchView (contexto de contexto final) {
             Super (contexto);
             This.setIconifiedByDefault (true);
         }

         @Anular
         Public boolean dispatchKeyEventPreIme (evento KeyEvent) {
             If (event.getKeyCode () == KeyEvent.KEYCODE_BACK && 
                 Event.getAction () == KeyEvent.ACTION_UP) {
                 This.onActionViewCollapsed ();
             }
             Return super.dispatchKeyEventPreIme (event);
         }
     }

Siempre puede ampliar las vistas y anular los métodos de escucha de la siguiente manera:

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

Encontré la respuesta, la clave para ello fueron las respuestas anteriores de Mr. Ali Imran y de neworld tengo que Anular este método:

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

Se llama cada vez que searchView está cerrado, por lo que puede manejar el caso backbutton a.

Misma respuesta que hacer una vista de búsqueda personalizada, pero con el oyente

 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(); } } 

Clase de utilidad para la visibilidad del teclado, por lo que si el teclado visible atrás Presione ocultará no cerrar la actividad

 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); } } 

Código de muestra:

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

Anular este método puede ayudarle

  @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub return super.onKeyDown(keyCode, event); } 
  • ¿Cuál es la diferencia entre setBackgroundResource y setBackgroundDrawable
  • Debe pasar en una vista no nula
  • Establecer una imagen de fondo en una vista extiende mi vista
  • ¿Cómo puedo hacer que `View` llene un` RelativeLayout`?
  • Disposición personalizada de Android - onDraw () nunca se llama
  • Vista de la actividad actual de Fade Out
  • Vista de niño androide sin estado de prensa
  • View.onMeasure () no se llama
  • ¿Es posible cambiar el textcolor en un Android SearchView?
  • Cambiar el color del cursor en SearchView sin ActionBarSherlock
  • ¿Cómo implementar un titular de vista?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.